본문 바로가기
C++

C++ 강의 7장 - 참조자(Reference) -

by ChocoPeanut 2017. 4. 24.

C++ 강의 7

- 참조자(Reference) -

 

변수라고 하는 것은 할당된 메모리 공간에 붙여진 이름이다. 우리는 이 이름을 가지고 해당 메모리 공간에 접근이 가능해진다. 그러면 참조자는 무엇일까? 참조자할당된 하나의 메모리 공간에 다른 이름을 붙이는 것을 말한다. 자신이 참조하는 변수를 대신할 수 있는 또 하나의 이름인 것이다. 쉽게 말하면 별명이라고도 할 수 있을 것 같다.


예시를 통해 설명을 들어보자. num1이라는 변수를 우선 선언해보자. 정수의 값을 가지기 위해 intnum1을 선언한다. 그러면 메모리의 어느 공간에 num1이라는 이름을 부여한다. 그리고 우리는 그 num1이라는 메모리 공간에 10을 선언한다.



그러면 여기서 num1이라는 메모리 공간에 다른 이름도 부여하고 싶다. 그러면 다음과 같이 선언을 하면 num2라는 이름이 num1의 메모리 공간에 동시에 부여된다. 그러면 num2의 메모리 공간의 값을 출력해도 num1의 메모리 공간의 값과 같게 나오는 것을 볼 수 있다. 특정 사람에 대해 이름을 부르지 않고 별명을 불러도 그 사람을 지칭하는 것으로 동일하니 이와 같은 경우라고 할 수 있다.



하지만 참조자를 선언할 때에는 조건이 있다. 참조자는 이미 선언되어져 있는 변수에 대해서만 선언이 가능하다. 선언됨과 동시에 누군가를 참조를 해야 하는 것을 의미한다. 따라서 상수에 대한 참조는 유효하지 않다. 또한 아무것도 참조하지 않는 형태의 선언도 유효하지 않는다. NULL로 초기화하는 것도 불가능하다.

이젠 참조자와 함수의 관계를 알아볼 것이다. 참조자의 활용에서 변수와 참조자를 동시에 선언하여 사용할 상황이 많이 있겠는가? 위의 상황보다는 참조자를 함수에 활용하는 경우가 매우 많을 것이다.



Call-by-valueCall-by-reference에 대해 들어보았는가? Call-by-value는 값을 인자로 전달하는 함수의 호출방식이고 Call-by-reference는 주소 값을 인자로 전달하는 함수의 호출방식이다. 인자를 값과 주소 값으로 나누어진다는 것이 차이점이다. Call-by-value 기반의 함수는 함수 외부에 선언된 변수에 대한 접근이 불가능하다. 하지만 Call-by-reference 기반의 함수는 함수 외부에 선언된 변수의 변형이 가능하다.



메모리 기반의 원리를 통해 두 가지 경우를 비교해보자. 우선 Call-by-value에 대한 예시를 들도록 하겠다. 두 변수에 값을 바꾸어주는 Swap()이라는 함수를 예시로 들어보겠다. 메모리 측면에서 보면 우선 num1num2라는 메모리 공간을 할당한다. 그 위치에 510이라는 값을 각각 넣어준다. 그리고 Swap()이라는 함수에 num1num2를 인자로 넣는다. 그런데 여기서 Swap(int a, int b)ab라는 변수에 대한 메모리 공간이 생성된다. 이 공간은 num1num2와는 다른 공간이다. 식을 다르게 작성하면 int a = num1, int b = num2라는 식을 사용한 것과 같은 효과를 나타낸다. 그리고 ab 사이의 값의 교환이 일어난다. 그리고 함수가 종료되면 ab는 지역변수이므로 메모리의 값을 반환하고 사라진다. 그러면 num1num2의 값에는 변화가 생기겠는가? 전혀 그렇지 않다. 이런 것을 통해 Call-by-value에 의해서는 함수 외부의 선언된 변수로 접근이 불가능하는 것을 알 수 있다.



그러면 Call-by-reference는 어떨까? 앞의 경우와 같이 num1num2가 선언이 된다. 값도 똑같이 들어가 있다. 그런데 Swap()함수를 불러올 때 Swap(int &a, int &b)로 함수가 선언이 되어있다. 그러면 이는 int &a = num1, int &b = num2num1num2에 다른 이름인 ab를 만들어주는 것이다. 그러므로 anum1은 같은 메모리 주소를 가지고 있고 bnum2도 같은 메모리 주소를 가지게 된다. 이에 대해 값을 바꾸어주게 되면 num1num2의 값을 바꾸어 주는 것과 같다. 그리고 함수가 끝나면 참조자의 형태로 이름이 주어진 ab라는 이름이 사라지게 된다. 출력을 해보면 값이 바뀌었음을 알 수 있다.



Call-by-value에 의한 메모리와 Call-by-reference에 의한 메모리의 차이이다.