레퍼런스란?
- 특정 변수의 실제 이름 대신 사용할 수 있는 별명
- cpp에서 지원하는 변수 타입의 일종이다.
- 대상 변수와 같은 메모리 위치를 참조한다.
사용 방식
cpp
int a;
int &b = a; // b는 a의 참조자
/* <특징>
1. 참조자 타입 == 대상 변수 타입
2. 선언과 동시에 초기화
------ 잘못된 예시 ------
int &b;
b = a;
------ -------- --------
3. 참조 대상 변경 불가.
------ 잘못된 예시 ------
int &b = a;
b = c;
------ -------- --------
*/
사용 예시
cpp
int x = 10;
int &y = x;
y++;
cout << y << " " << x << endl;
// 결과는 둘 다 11이다.
// 참조 대상과 같은 곳을 가리키고 있기 때문.
레퍼런스는 주로 함수의 인수가 객체일 때 사용한다.
cpp
// 값으로 전달 => call-by-value
void addOne(int y) {
// y의 복사본을 만든 후, "+ 1"을 수행한다.
// 복사본이 큰 경우, 성능이 저하된다.
y += 1;
}
// 레퍼런스로 전달 => call-by-reference
void addOne(int &y)
{
// y의 대상 변수가 같이 변하게 됨.
y += 1;
}
원래 값이 영향을 안 받게 하고 싶으면 const 키워드를 쓴다.
cpp
void Number::foo(const int& x)
{
std::cout << x << std::endl; // 올바른 사용
x = x * 10 + 12; // 잘못된 사용 (값을 변경할 수 없음)
}
레퍼런스 vs 포인터
반면 포인터는 다음과 같이 쓴다.
cpp
왜 레퍼런스인가?
- 포인터보다 더 안전하다.