[C++] 참조자, C++참조자, C++ 참조자란? C++ Reference

728x90
반응형

C++에는 C 언어의 포인터(Pointer)와 유사한 개념의 참조자(Reference)라는 것이 있다. 

 

참조자를 이야기 하기전에 우선 변수에 대한 개념을 다시 확인해보자.

 

변수란?

할당된 메모리 영역에 붙여진 이름으로 변수를 통해 메모리 영역에 접근이 가능하다. 

위 그림으로 예를 들어 설명하면, char형 변수 Value는 1Byte의 메모리 공간이 할당됬고, 할당된 메모리 영역의 주소는 0x1000 번지다. 즉 Value를 통해 0x1000 번지에 저장된 1byte의 데이터에 접근할 수 있다는 뜻이다. 

 

 

참조자는 "변수의 별명" 이라고 할 수 있다. 코드를 통해 알아보자. 

#include <iostream>

using namespace std;

int main(void)
{
	int value = 10;
	int &value_ref = value; // int& value_ref = value;

	cout << value << endl;
	cout << value_ref << endl;

	return 0;
}

 

int형 변수 value을 선언하고 10으로 초기화 했다. & 연산자는 C에서 주소 값을 반환하는 연산자다. 하지만 C++에서 변수 선언시에 사용하면 참조자 선언을 뜻하게 된다. 참조차 value_ref를 선언하고 value로 초기화 시켰다. 

10
10

결과는 위와 같이 10 10이 나온다. 참조자는 변수의 별명이기 때문에 value라는 이름을 갖는 메모리영역에 value_ref라는 별명이 붙어서 위와 같은 출력 결과가 나온다. 

 

아래 코드를 value 의 메모리 영역에 저장된 값과, value_ref가 참조하고 있는 메모리영역의 값을 출력하고, value와 value_ref의 주소를 출력하는 코드다.

#include <iostream>

using namespace std;

int main(void)
{
	int value = 10;
	int &value_ref = value;

	cout << value << endl;
	cout << value_ref << endl;

	cout << &value << endl;
	cout << &value_ref << endl;

	return 0;
}

 

 

내 PC 기준으로 아래와 같이 출력된다. 

10
10
000000FE196FFC54
000000FE196FFC54

 

변수 value와 참조자의 value_ref의 주소값이 같은 것을 확인 할 수 있다.

 

메모리 영역에 참조자의 갯수에는 제한이 없다. 아래 코드를 통해 확인해보자. 

 

#include <iostream>

using namespace std;

int main(void)
{
	int value = 10;
	int &value_ref = value;
	int& value_ref_ref = value_ref;

	cout << value << endl;
	cout << value_ref << endl;
	cout << value_ref_ref << endl;

	cout << &value << endl;
	cout << &value_ref << endl;
	cout << &value_ref_ref << endl;

	return 0;
}

 

출력결과 

10
10
10
000000FA34AFF514
000000FA34AFF514
000000FA34AFF514

 

 

참조자는 선언과 동시에 어떠한 변수를 참조해야하고, 동일한 자료형을 갖는 변수를 참조해야한다. 

int value = 10;
char &value_ref = value;

위와 같은 형태의 참조는 불가능하다. 

 

아래 두가지 형태와 같이 숫자, NULL 등을 참조하는것은 불가능하다. 

int &value_ref = 20;
int &value_ref = NULL;

 

 

배열은 배열 요소만 참조 가능하다. 

#include <iostream>

using namespace std;

int main(void)
{
	int array[10] = { 0,1,2,3,4,5,6,7,8,9 };

	int &array_ref = array[5];

	cout << array[5] << endl;
	cout << array_ref << endl;

	return 0;
}

 

 

포인터 변수도 하나의 변수이기 때문에 참조 가능하다. 

#include <iostream>

using namespace std;

int main(void)
{
	int value = 10;

	int *ptr = &value;
	
	int *(&ptr_f) = ptr;

	cout << value << endl;
	cout << *ptr << endl;
	cout << *ptr_f << endl;

	int** double_point = &ptr;
	int** (&double_point_ref) = double_point;


	cout << **double_point_ref << endl;
	
	return 0;
}

 

 

 

 

 

 

내용정리 

 


  • 참조자(Reference)는 변수에 할당된 메모리영역의 별명이다. 
  • 참조자 선언시 자료형이나 참조자이름 앞에 & 연산자를 사용해야 한다.
  • 참조자를 통해 메모리 영역에 접근이 가능하다. 
  • 하나의 메모리 영역을 다수의 참조자가 참조할 수 있다.
  • 참조자는 변수에 할당된 메모리영역의 "별명"이기 때문에 선언과 동시에 변수를 참조해야 하고, 변수를 제외한 다른 형태(정수, NULL 등)는 참조할 수 없다.
  • 포인터 변수도 참조자 선언이 가능하다. 
  • 동일한 자료형을 갖는 변수만 참조 할 수 있다.
  • 배열은 참조 할 수 없고, 배열 요소는 참조가능하다. 배열 요소는 하나의 변수로 간주되기 때문이다. 

 

 

 

 

- 끝 -

728x90
반응형