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 등)는 참조할 수 없다.
- 포인터 변수도 참조자 선언이 가능하다.
- 동일한 자료형을 갖는 변수만 참조 할 수 있다.
- 배열은 참조 할 수 없고, 배열 요소는 참조가능하다. 배열 요소는 하나의 변수로 간주되기 때문이다.
- 끝 -
'Programming language > C++' 카테고리의 다른 글
[C++] new, delete, 메모리 할당, 메모리 관리 (1) | 2024.05.02 |
---|---|
[C++] 생성자(constructor), 디폴트 생성자(default constructor), 생성자? 생성자 란? 생성자 오버로딩 (0) | 2024.05.01 |
[C++] bool(boolean), C++에서 등장하는 새로운 자료형 (0) | 2024.01.17 |
[C++] namespace, 이름 공간, 네임스페이스 란? 범위지정 연산자 ::, using 키워드, 네임스페이스의 별칭 (2) | 2024.01.11 |
[C++] inline 함수란? (0) | 2024.01.02 |