참조자의 이해
- 변수는 할당된 메모리 공간에 붙여진 이름이다
- 그리고 그 이름을 통해서 해당 메모리 공간에 접근이 가능하다.
- 할당된 하나의 메모리 공간에 둘 이상의 이름을 부여할 수는 없을까? ==> 참조자의 이해로 이어진다
int num1 = 2010;
==> 2010으로 초기화된 메모리 공간에 num1이라는 이름이 붙게 된다
int* ptr = &num1; // 변수 num1의 주소 값을 반환해서 포인터 ptr에 저장해라!
int& num2 = num1; // 변수 num1에 대한 참조자 num2를 선언해라!
- & 연산자는 C언어 포인터에서 배웠듯이 변수의 주소 값으로 반환하는 연산자였지만 참조자에서는 의미가 또 다르다
- 이미 선언된 변수의 앞에 이 연산자가 오면 주소 값의 반환을 명령하는 뜻이 되지만, 새로 선언되는 변수의 이름 앞에 등장하면, 이는 참조자의 선언을 뜻하는 게 된다
int& num2 = num1;
==> num2는 num1의 '참조자'가 된 것이다
num2 = 3047;
==> num1의 메모리 공간에 3047이 저장된다
*참조자는 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름이다
#include <iostream>
using namespace std;
int main(void)
{
int num1 = 1020;
int& num2 = num1;
num2 = 3047;
cout << "VAL: " << num1 << endl;
cout << "REF: " << num2 << endl;
cout << "VAL: " << &num1 << endl;
cout << "REF: " << &num2 << endl;
return 0;
}
참조자는 별칭이다
C++에서는 참조자를 '변수에 별명(별칭)을 하나 붙여주는 것이다' 라고 설명한다
int& num2 = num1;
위 코드를 보고 참조자를 이해하자면 num1이 변수의 이름이라면, num2는 num1의 별명이라는 뜻이다
참조자의 수에는 제한이 없으며, 참조자를 대상으로도 참조자를 선언할 수 있다
int num1 = 2759;
int& num2 = num1; // num2는 num1의 별명
int& num3 = num1; // num3는 num1의 별명
int& num4 = num1; // num4는 num1의 별명
==> 여러 개의 참조자를 선언하는 것도 가능하다
int num1 = 2759;
int& num2 = num1; // num2는 num1의 별명
int& num3 = num2; // num3는 num2의 별명
int& num4 = num3; // num4는 num3의 별명 즉 num4는 num1의 별명
==> 참조자를 대상으로 참조자를 선언해도 같은 결과가 나온다
참조자의 선언 가능 범위
참조자는 변수에 대해서만 선언이 가능하고, 선언됨과 동시에 누군가를 참조해야만 한다.
int& ref = 20; (x)
==> 변수에 또 다른 이름을 붙이는 것이기 때문에 상수를 대상으로 참조자를 선언할 수는 없다
int& ref; (x)
==> 미리 참조자를 선언했다가, 후에 누군가를 참조하는 것은 불가능하며, 참조의 대상을 바꾸는 것도 불가능하다
int& ref = NULL; (x)
==> 포인터 변수의 선언처럼 참조자를 선언하면서 NULL로 초기화하는 것도 불가능하다
#include <iostream>
using namespace std;
int main(void)
{
int arr[3] = { 1,3,5 };
int& ref1 = arr[0];
int& ref2 = arr[1];
int& ref3 = arr[2];
cout << ref1 << endl;
cout << ref2 << endl;
cout << ref3 << endl;
return 0;
}
==> 배열요소는 변수로 간주되어 참조자의 선언이 가능하다
#include <iostream>
using namespace std;
int main(void)
{
int num = 12;
int* ptr = # // 포인터 ptr은 num을 가리킨다
int** dptr = &ptr; // 이중포인터 dptr은 ptr을 가리킨다
int& ref = num;
int* (&pref) = ptr; // int* (&pref) = #
int** (&dpref) = dptr; // int** (&dpref) = #
cout << ref << endl;
cout << *pref << endl;
cout << **dpref << endl;
return 0;
}
==> 포인터 변수도 변수이기 때문에 참조자의 선언이 가능하다
(이중포인터의 개념이 사용됨)
'C++ 이야기 (열혈) > C언어 기반의 C++ 2' 카테고리의 다른 글
6. C++에서 C언어의 표준함수 호출하기 (0) | 2023.01.17 |
---|---|
5. malloc & free를 대신하는 new & delete (0) | 2023.01.17 |
4. 참조자(Reference)와 함수 (0) | 2023.01.17 |
2. 새로운 자료형 bool (0) | 2023.01.17 |
1. 시작에 앞서 (0) | 2023.01.17 |