레퍼런스
- 변수의 별명. 객체의 또 다른 이름. 코드에서 다루는 방법은 일반 변수와 같지만 내부적으로는 원본 변수에 대한 포인터로 취급
- 레퍼런스 변수는 반드시 초기화 해야 한다. (이렇게 참조관계가 한 번 정의되면 이를 끊고 다른 변수와 연결이 불가능)
- const 속성을 부여할 수 있다(const 속성을 갖는 레퍼런스 변수는 자신의 값을 변경할 수 없게 된다.)
int score = 92; // score 선언 후 초기화
int& rScore = score; // rScore 선언하고 연결
레퍼런스는 선언과 동시에 초기화를 해줘야 한다. 초기화 안해주면 오류지만 예외는 있다.
rScore는 Score와 똑같이 사용할 수 있다.
int num = 100;
double& rNum = num; // 컴파일 오류
컴파일 오류가 발생한다. 자료형이 일치해야 한다.
int score = 92;
int& rScore = score;
int num = 80;
int& rScore = num; // 컴파일 오류
rScore 참조변수가 score와 연결한 뒤, 이를 끊고 num과 연결하려고 해서 컴파일 오류가 발생한다.
참조 관계는 한 번 정의되면 변경될 수 없다. 참조 변수가 선언되고 어떤 변수와 연결되면, 참조 관계는 스코프를 벗어나서 변수가 파괴되기 전까지는 계속 유지된다. (constant relation: 영구적인 관계)
int score = 92;
int& rScore = score;
int num = 80;
rScore = num;
이 코드의 마지막 문장은 참조 연결을 하는 문장이 아니라 에러가 발생하지 않는다.
score, rScore는 80으로 값이 변경된다.
double d1 = 3.97;
double& rd1 = d1;
cout << d1 << ' ' << rd1 << endl; // 3.97 3.97
rd1 = 3.5;
cout << d1 << ' ' << rd1 << endl; // 3.5 3.5
d1에게 rd1이라는 별명을 붙여주면 둘은 같은 값을 가리키게 된다.
rd1의 값을 바꾸면 d1의 값도 바뀐다.
d1의 값을 바꿔도 rd1의 값이 바뀐다.
double d1 = 3.97;
double d2 = 4.01;
double& rd1 = d1;
rd1 = 3.5;
rd1 = d2;
cout << d1 << ' ' << rd1 << ' ' << d2 << endl; // 4.01 4.01 4.01
rd1과 d1의 관계가 이미 초기화됐기 때문에 d2를 rd1에 넣는 것은 둘이 묶이는 것이 아니라 d2의 값이 rd1이 가리키는 값(d1)에 들어가게 된다.
참조 다중성
int num = 100;
num& rNum1 = num; // rNum1과 num을 연결
num& rNum2 = num; // rNum2과 num을 연결
num& rNum3 = num; // rNum3과 num을 연결
3개의 참조 변수를 만들었으므로 num, rNum1, rNum2, rNum3으로 같은 메모리 위치에 접근할 수 있다.
int num1 = 100;
int num2 = 200;
num& rNum = num1;
num& rNum = num2; // 컴파일 오류
참조 변수 하나를 여러 변수와 연결하려고 하면 컴파일 오류가 발생한다.
int& x = 92; // 컴파일 오류
참조 변수에 값을 바로 넣는 것은 불가능하다.
값 변경
const
1. 원본 변수, 참조 변수로 메모리 위치의 값 변경 가능
int score = 92;
int& rScore = score;
2. const 한정자가 붙지 않은 참조 변수에 const 한정자가 붙은 변수를 바인드하면 컴파일 오류 발생
const int score = 92;
int& rScore = score; // 컴파일 에러
3. 원본 변수를 사용해서 값을 변경할 수 있지만, 참조 변수를 사용해서는 값 변경 불가(read only)
int score = 92;
const int& rScore = score;
4. 원본 변수와 참조 변수를 통해서 데이터를 변경할 수 없다. (read only)
원본 변수에 const 한정자가 붙으면 값을 변경할 수 없다. 원본 변수에 const 변수를 붙였다면 참조변수도 const 한정자를 붙여야 한다.
const int score = 92;
const int& rScore = score;
int b = 1;
int& rb = b;
cout << " " << b << " " << rb << endl; // 1 1
rb = 2;
cout << " " << b << " " << rb << endl; // 2 2
레퍼런스 변수에 const 속성을 부여하면
int b = 1;
const int& rb = b;
cout << " " << b << " " << rb << endl; // 1 1
// rb = 2; // 컴파일 에러
b = 3;
cout << " " << b << " " << rb << endl; // 3 3
레퍼런스 변수를 통해 값을 변경할 수 없게 된다. rb의 값을 변경할 수 없다.
변수 b의 값을 변경하는 것은 가능하다.
댓글