기존 변수에 새 이름을 지정해주는 용도
변수에 타입 뒤에 &를 붙이면 그 변수는 레퍼런스가 된다.
개발자가 코드에서 다루는 방법은 일반 변수와 같지만 내부적으로는 원본 변수에 대한 포인터로 취급한다.
int x = 32;
int& x_refer = x;
이게 왜있나 싶을 수도 있는데, 함수에 매개변수로 전달하는 과정에서 유용하게 사용된다.
레퍼런스 전달 방식
일반적으로 함수에 매개변수로 전달한 변수는 값 전달 방식(pass by value)로 처리된다.
즉, 함수에 전달되는 과정에서 복사가 일어난다!
이는 일반적으로 함수에 매개변수로 전달된 원본 객체의 필드나 변수의 값을 변경할 수 없도록 방어한 조치인데,
만약 원본 변수의 값을 변경하는 함수를 만들고 싶다면 C언어에서는 복잡한 포인터 연산을 수행할 수 밖에 없었다.
하지만 C++에서는 포인터 연산 대신 레퍼런스 전달 방식을 활용하면 편리하다.
아래는 예시
void addOne(int i){
i++;
}
void addOne(int& i){
i++;
}
레퍼런스를 인수로 받는 버전의 addOne은 원본변수의 값도 1 증가시킨다.
만약 위 코드를 보고
int x = 3;
int& intrefer = x;
addOne(intrefer); // 레퍼런스를 인수로 받는 버전의 addOne 호출
addOne(3); // 리터럴 상수를 전달하여 레퍼런스를 인수로 받는 버전의 addOne이 호출되지 않는다.
r-value, 즉 리터럴 상수를 전달하면 의도와 달리 레퍼런스르 ㄹ인수로 받는 버전의 addOne 이 실행되지 않을것이다.
const reference 전달 방식
일반적으로 원본 변수의 값을 바꾸기 위해 reference 전달 방식을 택할 것이라고 생각하겠지만, const & 자료형 으로 전달하는것도 활용된다.
이렇게 함으로써 생기는 장점은
- 원본 변수는 변경하고 싶지 않지만, 함수에 매개변수가 전달될 때 복제되어 성능이 저하되는것이 우려될 경우
- 객체를 다루는 경우
레퍼런스 전달 방식과 달리 const reference 전달 방식은 리터럴 상수와 r-value를 전달할수 있다.!
void addOne(const int& i){
cout << i * i < <endl;
}
addOne(3); //가능
int Sum(int num1, int num2){
return num1+num2;
}
int a = 5;
int b = 10;
int main(){
Sum(a,b);
}
int Sum(int num1, int num2){
int infunction_1 = num1;
int infunction_2 = num2;
return num1+num2;
}