레퍼런스(reference)

레퍼런스란?

C++에서 객체를 조작하기 위해서 변수와 포인터를 사용합니다. 여기에 레퍼런스(reference)라는 이름의 변수가 하나 더 등장합니다.

 

↘ 레퍼런스(reference)라고도 하고 참조 변수(reference varialbe) 라고도 합니다.

 

↘ 대상 객체(target object)에 대한 별명(alias)라고 말하기도 하며

 

↘ 대용 이름 (대체 이름)이라고 부르기도 합니다.

 

이름이 많아서 헷갈릴 수 있으니 이 포스팅에서는 레퍼런스라고 하겠습니다.

 

코드를 보면서 이야기하는게 좋겠네요.

 

int & rMyRef 를 보면 고개를 갸우뚱할 수 있습니다. & 연산자는 주소연산자가 아닌가? rMyRef 라는 변수의 주소에 초기화되지 않은 intNum 값을 대입한다는 의미로 혼동할 수 있기 때문입니다.

 

여기서 & 연산자는 레퍼런스를 선언하기 위한 의미로 사용됩니다. 위의 문장의 의미는 rMyRef 를 정수형 intNum 의 레퍼런스로 선언한다는 뜻입니다. 이제 rMyRef는 intNum을 부를 수 있는 또 하나의 별명(alias)가 됩니다.

 

아래와 같이 실행한다면 두 값은 같습니다. 원래 변수(target object)가 변하면 레퍼런스도 변합니다.

 

또한 레퍼런스의 값을 바꾸면 원래 변수도 변합니다. 이제부터 두 변수는 이름이 다를 뿐 일심동체가 됩니다. 주소연산자 & 를 사용해서 확인하면 메모리가 같음을 볼 수 있습니다. 이는 변수가 두개가 아니라 하나 라는 것 입니다. 여기까지는 어렵지 않게 알 수 있습니다.

 

▣기본변수(target object)

 

▣레퍼런스(alias)

 

⇒ 하나의 메모리 주소를 사용한다.

 

 

그렇다면 레퍼런스를 재할당하면 어떻게 될까요? 다른 변수의 레퍼런스로 바뀔지 알아보겠습니다.

 

결과를 보면 새로운 사실을 알 수 있습니다.

 

newNum이라는 새로운 변수가 메모리에 생성되었는데 레퍼런스인 rMyRef은 기존의 변수를 그대로 가리키고 있습니다. 값은 모두 172로 변했습니다.

 

메모리에는 지금 두개의 주소에 값이 저장되어 있습니다. intNum에 172 newNum에 172 그리고 intNum 을 가리키는 rMyRef 가 있죠.

 

⇒ 레퍼런스는 재할당 할 수 없다. 기존 변수(target object)의 값을 바꿀 뿐이다.

 

마치 포인터에 const 를 걸어서 상수화 시킨 것과 비슷한 모습입니다. 가리키는 값을 바꿀 수는 있지만 주소는 바꿀 수 없다.

 

정리

C++의 레퍼런스는 & 레퍼런스 연산자를 사용해서 선언합니다. &는 주소연산자와는 다르게 동작합니다.

 

한번 레퍼런스에 할당하면 대상객체(target object)를 바꿀 수 없습니다.

 

레퍼런스(reference variable) 사용법

 

▶ 대상 객체에 대한 별명을 만들기 위해 레퍼런스를 만듭니다

 

▶ 레퍼런스는 초기화해야 합니다.

 

▶ 레퍼런스에 재할당하지 않습니다.

 

▶ & 주소연산자와 레퍼런스 연산자와 혼동하지 않습니다.

 

C++에서도 레퍼런스는 어려운 내용이니까 잘 이해가 가지 않아도 너무 조급하게 생각하지 말고 하나씩 실습을 하면서 사용법을 익히는게 좋습니다. C++은 pointer 를 넘어가면 그 때 부터는 스트레스를 주는 내용이 좀 나오는데 이거는 누구나 다 겪는 일이니까 너무 열받을 필요가 없어요.

 

*예제코드

#include <iostream>

using namespace std;

#define Line cout <<"\n-----------------------------\n"

int main()
{
	int intNum;
	int & rMyRef = intNum;

	intNum = 10;

	Line;
	cout << " intNum: " << intNum << endl;
	cout << " rMyRef: " << rMyRef << endl;

	rMyRef = 77;
	
	Line;
	cout << " intNum: " << intNum << endl;
	cout << " rMyRef: " << rMyRef << endl;
	cout << " &intNum: " << &intNum << endl;
	cout << " &rMyRef: " << &rMyRef << endl;

	int newNum = 172;
	rMyRef = newNum;

	Line;
	cout << " intNum: " << intNum << endl;
	cout << " rMyRef: " << rMyRef << endl;
	cout << " newNum: " << newNum << endl;
	cout << " &intNum: " << &intNum << endl;
	cout << " &rMyRef: " << &rMyRef << endl;
	cout << " &newNum: " << &newNum << endl;

	return 0;
}

공유하기

facebook twitter kakaoTalk kakaostory naver band