참조자의 이해


무엇을 가리켜 변수라 할까요? 다음은 여러분이 잘 알고 있는 변수의 정의입니다.


변수는 할당된 메모리 공간에 붙여진 이름입니다. 그리고 그 이름을 통해서 해당 메모리 공간에 접근이 가능합니다.



int &num2 = num1;


이 문장은 다소 혼란스러울 수 있습니다. 왜냐하면 & 연산자는 변수의 주소 값을 반환하는 연산자이기 때문입니다. 하지만 위의 문장에서 보이듯이 & 연산자는 전혀 다른 의미로도 사용됩니다. 이미 선언된 변수의 앞에 이 연산자가 오면 주소 값의 반환을 명령하는 뜻이 되지만, 새로 선언되는 변수의 이름 앞에 등장하면, 이는 참조자의 선언을 뜻하는게 됩니다.


int *ptr = &num1;    // 변수 num1의 주소 값을 반환해서 포인터 ptr에 저장해라!

int &num2 = num1    // 변수 num1에 대한 참조자 num2를 선언해라!


따라서 변수 num1의 선언 이후에 다음 문장이 실행되면,


int &num2 = num1;


num2는 num1의 '참조자'가 되며, 이는 num1이라 이름 붙어있는 메모리 공간에 num2라는 이름이 하나 더 붙은 꼴입니다.


참조자는 자신이 팜조하는 변수를 대신할 수 있는 또 하나의 이름인 것입니다.


전통적으로 C++에서는 참조자를 다음과 같이 설명합니다.


변수에 별명(별칭)을 하나 붙여주는 것 입니다.




참조자의 수에는 제한이 없으며, 참조자를 대상으로도 참조자를 선언할 수 있습니다. 


하지만, 필요 이상으로 참조자를 선언하는 것은 바람직하지 않으며, 참조자를 대상으로 또 다른 참조를 만드는 일이 흔히 필요하지는 않습니다. 



참조자의 선언 가능 범위


참조자는 변수에 대해서만 선언이 가능하고, 선언됨과 동시에 누군가를 참조해야만 합니다.


int &ref = 20; (x)


참조자는 본디, 변수에 또 다른 이름을 붙이는 것이기 때문에 상수를 대상으로 참조자를 선언할 수는 없습니다. 또한 미리 참조자를 선언했다가, 후에 누군가를 참조하는 것은 불가능하며, 참조의 대상을 바꾸는 것도 불가능합니다.


int &ref; (x)


참조자를 선언하면서 NULL로 초기화하는 것도 불가능합니다. 


int &ref = NULL; (x)


참조자는 무조건 선언과 동시에 변수를 참조하도록 해야 합니다.


int arr[3] = {1, 3, 5};

int &ref1 = arr[0];

int &ref2 = arr[1];

int &ref3 = arr[2];


배열요소는(배열이 아니라, 배열의 요소는) 변수로 간주되어 참조자의 선언이 가능합니다. 그리고 포인터 변수도 변수이기 때문에 참조자의 선언이 가능합니다.


int num = 12;

int *ptr = #

int **dptr=&ptr;


int &ref = num;

int *(&pref) = ptr;

int **(&dpref) = dptr;



출처

  • 열혈 C++ 프로그래밍


+ Recent posts