C++ 에서 새롭게 추가된 형태의 변수 타입인 참조자는 포인터와 비슷한 역할을 한다. 하나의 메모리 공간을 가르키는 여러개의 변수 라는 개념으로 이해 할 수 있다.
int num = 10;
int& refNum = num;
참조자는 위와 같이 선언 될수 있는데, 반드시 선언 시에 참조 할 변수를 할당 해 주어야 한다. 참조자가 선언 되고 나면, 선언시에 할당 된 변수와 같은 메모리 주소의 값을 가르키게 된다. 즉, num과 refNum은 변수의 이름만 다르고 완벽하게 같은 변수라고 볼 수 있는것이다. 만약 refNum의 값을 20으로 바꾼다면, num의 값도 20으로 바뀐다. 이러한 특성으로 인해서 참조자를 변수의 별명이라고 이해하면 편하다.
참조자는 변수로써의 활용 보다 함수의 인자로써 활용 하기 위해서 만들어 졌다.
C언어 에서 함수 내부에서 외부에 있는 변수의 값을 변경 하기 위해서 Call-by-reference 방식을 사용하여, 함수의 인자로 해당 변수의 포인터를 넘겨 주었다. 여기서 Call-by-reference란, 다음과 같은 정의를 지닌다.
함수 외부의 변수의 주소값을 전달 받아서, 외부에 선언된 변수에 접근 하는 형태의 함수 호출
즉, 주소 값이 외부 변수의 참조 도구로 사용되는 함수의 호출을 의미한다.
위와 같은 외부 변수의 접근 방법의 수단으로도 참조자를 사용할 수 있다.
void Swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
int main(){
int a = 10;
int b = 20;
Swap(a, b);
}
위의 코드는 Swap 함수의 인자에 참조자를 사용하여 함수 외부의 변수 a, b의 값을 바꾸는 동작을 한다. 포인터를 사용한 방법과 달리, 단순히 변수를 함수에 넘겨 주기만 하면, 참조자를 활용해 두 변수의 값이 바뀌게 된다.
참조자를 인자로 가진 함수와 Call-by-value 방식의 인자 전달을 가진 함수가 있다고 가정하자. 두 함수 모두 사용할때 둘 다 일반적인 변수를 인자로 대입한다. 이때, 만약 인자로 대입한 변수의 값이 변경된다면, 이는 프로그래머 입장에서 변수의 의도치 않은 변형이 될것이다. 이러한 점을 방지하기 위해서 참조자에 const 키워드를 사용할 수 있다.
void Swap(const int& a, const int& b){
int temp = a;
a = b;
b = temp;
}
Swap 함수를 위와같이 변경하고 사용한다면, 에러가 발생한다. 왜냐하면, const 키워드를 통해 참조자를 상수화 하였는데, 함수 내부에서 상수화 된 인자의 값을 변경하려고 시도 하였기 때문이다.
위와같은 방식으로 의도치 않은 변수의 값 변경을 방지 할 수 있다.