참조자 (Reference)

int& ref = number;

위와 같은 방식으로 선언, 참조자는 반드시 정의시 초기화가 되어야한다

int& ref;

위와 같이 참조자 변수만 선언하는 것은 불가능하다.
참조자는 일종의 별명과 같은 역할을 하므로 어떤 변수에 대한 별명인지, 즉 어떤 변수를 참조하고 있다는 것이 정의되지 않으면 아무런 의미도 없기 때문이다. 참조자는 한번 선언되면 다른 변수를 참조하게 변경할 수 도 없다. 참조자는 그 변수 자체의 다른 이름으로 생각하면 편할 것이다.

  • 포인터와의 차이점
    포인터는 참조자와 다르게 다른 변수를 참조하지 않고서 혼자서도 선언이 가능하다. 포인터는 어떠한 주소값을 담고 있는 하나의 변수이기 때문에 가능하지만 참조자는 어떠한 값을 담고 메모리 공간을 차지하는 것이 아니라 컴파일 시 할당된 변수의 주소로 치환해주는 역할만을 하기 때문이다.
int a = 10;
int &ref = a;
int b = 3;
ref = b;

벡터와 참조자

int function(vector<int>& v){}

벡터는 함수의 파라미터로 넘겨질 때 참조자 변수로 넘어가는데, 이는 함수 내에서 벡터의 값을 변경하는 것이 원래 벡터의 값도 변경하길 원하는 경우이다. 배열의 경우 배열을 파라미터로 넘겨주면, 배열의 포인터 값이 넘어가게 되어 자동으로 위의 기능이 이루어지지만 벡터는 지역변수로 복사되기 때문에 함수 안에서 값을 변경하더라도 함수 밖에서는 값이 변하지 않는다. 이 때문에 값을 변경하기 위한 목적으로 참조자로 넘겨주는 것이다.