작성
·
75
·
수정됨
2
int val1 = 123;
int val2 = 456;
int& reref = val1;
cout << reref << endl;
reref = 888;
cout << val1 << endl;
cout << reref << endl;
reref = val2; //여기서 재할당 하였습니다.
cout << reref << endl;
cout << val2 << endl;
--여기까진 제가 생각한 대로 출력이 되었습니다.--
reref = 1004; //재할당한 레퍼런스 변수 값을 변경하였습니다.
cout << reref << endl;
cout << val2 << endl;
cout << val1 << endl;
저는 여기서 reref와 val2가 1004가 출력이 되고 val1은 888이 나올 줄 알았지만, reref와 val1이 1004가 출력되고 val2는 456으로 값이 변경되지 않았습니다.
cout << &reref << " " << &val2 <<" " << &val1 << endl;
혹시나 해서 세 변수의 주소를 출력해보았는데 reref에 val2를 재할당했음에도 불구하고 reref와 val1의 주소가 일치하게 출력되었습니다.
재할당한 레퍼런스의 변수는 값을 변경하면 안되는 건가요??
레퍼런스변수가 재할당한 val2가 아닌,
선언 시의 val1의 주소와 값이 같은 이유가 궁금합니다!
환경은 visual studio 2022입니다!
답변 1
2
안녕하세요? 질문&답변 도우미 Soobak 입니다.
참조 변수는 반드시 선언과 동시에 초기화되어야 하며, 이후에는 참조하는 대상을 변경할 수 없습니다.
참조는 마치 별명(alias)처럼 동작하기 때문입니다.
즉, int& reref = val1;
으로 선언과 초기화를 하신 참조 변수 reref
는 val1
을 참조하는 별명처럼 동작하며, 이후 val1
과 같은 주소를 가지는 변수로 고정이 됩니다.
따라서, 중간에 reref = val2;
와 같이 작성하신 부분은 val2
변수의 '값' 을 val1
에 '대입'을 하는 것이며, '재할당' 을 하는 것이 아닙니다.
reref = val2; // val2 의 값을 val1 에 대입, (재할당이 아님)
cout << reref << endl; // 출력: 456 (val1 의 값이 456으로 변경된 것)
cout << val2 << endl;
이후의 reref = 1004;
코드 부분 또한 val1
을 참조하고 있는 reref
의 값을 1004
로 변경합니다.
따라서, val1
의 값이 1004
로 바뀌고, val2
는 영향을 받지 않는 것입니다.
안녕하세요? 질문&답변 도우미 Soobak 입니다.
네, 맞습니다. 옳게 이해하고 계십니다.
참조 대상 자체를 변경하는 것이 아니라, 참조 대상에 값을 다시 할당한다는 의미로 이해하시는 것이 옳습니다. 👍
아하 재할당은 불가하고 그냥 val1(== reref)에 val2 값을 대입한 것이 되는군요.
답변 감사합니다.
혹시, 강의 챕터 '6.14 참조 변수' 타임라인 6:26 부분에 재할당이 가능한가에 대해선 재할당은 불가하고 ref1에 value2값을 대입한 걸로 보면 될까요?