본문 바로가기
C++

[C++] 참조(Reference)

by imagineer_jinny 2022. 1. 22.

본 내용은 POCU COMP3200: C++ 언매니지드 프로그래밍 강의를 토대로 작성하였습니다.

 

  • 참조(Reference)
    • C++에서 포인터 연산이 없어도 될 때, 주소 변경이 없어도 될 때 안전하게 쓰기 위해 참조 씀
    • 포인터를 사용하는 좀 더 안전한 방법
    • 하지만 Java만큼 제한적이지는 않음
    • 먼저 이것부터 살펴 보자
      • 값에 의한 호출(call by value)
      • 참조에 의한 호출(call by reference)
      • 포인터(pointer)

 

  • 값에 의한 호출
    • 원본은 안바뀜
      swap에서 나가면 arg1, arg2 값 그냥 날라가고 바뀐 거 없음. 원본 안바뀜

 

  • 참조에 의한 호출
    • 포인터를 받음. 즉 어떤 값의 주소를 받아오는 것
      주소를 받아서 주소에 있는 값을 직접 바꾸니까 원본이 바뀜

 

  • 참조란?
  • 별칭이다
    • 값을 복사하는 게 아니라 number을 다른 이름으로 부르는 것 뿐
int number=100;
int& reference=number; // & : 참조형임을 나타내는 표시. *가 int*로 포인터형인것 나타내는 처럼

 

  • NULL이 될 수 없음
int& reference=NULL; //ERROR

 

  • 초기화 중에 반드시 선언되어야 함
    • 별칭임을 나타내는것이기 때문. 뭐의 별칭인데?
int& reference; //ERROR
  • 참조하는 대상을 바꿀 수 없음
int number1=100;
int number2=200;

int& reference=number1; //reference는 number1과 똑같은 것을 가리킨다
reference=number2; //세 변수 값이 모두 200이 됨

 

 

  • 함수 매개변수로서의 참조
    • 참조의 장점 : 참조가 포인터보다는 안전함 
      • number1과 number2 변수는 NULL이 될 수 없음
        • 포인터 같은 경우 호출자가 NULL을 넣을 수 있는데 NULL을 넣는 순간 읽어오려 하면 에러. 위험한 현상이 나타날 수 있음
        • 참조는 NULL이 될 수 없으니까 들어오는 값이 일단 유효해서 쓸 수는 있음. NULL 체크 안해도 됨
      • 우리가 소유하지 않은 메모리 장소를 가리킬 수 없음
        • 포인터의 경우 맘대로 int temp=*(number1+1) 같은 짓을 할 수 있음. 그러나 이건 내가 소유하지 않은 메모리이기 때문에 올바른 방법이 아님

복사해오는 것이 아니라 number1, number2를 참조하는, 즉 가리키는 것들

이 값들을 읽어오면 대입이니까 number1의 값을 temp에 넣고 temp값을 number2에 넣으면 두개가 동일하게 작동

즉, 참조를 이용한 swap 함수는 좀더 깔끔하게 짤 수 있다.

 

 

  • 컴퓨터는 참조가 뭔지 알까?
    • 모름
    • 포인터와 참조는 같은 어셈블리 명령어를 생성함
    • 참조는 오직 인간을 위한 것임
    • 컴파일러는 참조를 포인터로 바꿔 줌. 기계가 이해할 수 있도록

 

코드 샘플: 참조를 이용한 swap

#include <iostream>
#include "Swap.h"

using namespace std;

namespace samples
{
	void SwapExample()
	{
		cout << "+------------------------------+" << endl;
		cout << "|         Swap Example         |" << endl;
		cout << "+------------------------------+" << endl;
		int number1 = 1;
		int number2 = 2;

		cout << "Before swap: " << number1 << ", " << number2 << endl;
		Swap(number1, number2);
		cout << "After swap: " << number1 << ", " << number2 << endl;
	}

	void Swap(int& number1, int& number2)
	{
		int temp = number1;
		number1 = number2;
		number2 = temp;
	}
}

'C++' 카테고리의 다른 글

#2. 복사 생성자의 호출 시점  (0) 2022.02.04
#1. 왜 C++인가? / 생성자와 소멸자  (0) 2022.01.25
[C++] Bool 데이터형  (0) 2022.01.21
[C++] 입력(Input)  (0) 2022.01.21
[C++] C 스타일 배열과 std::array  (0) 2022.01.20

댓글