본문 바로가기
프로그래밍/More Effective C++

항목1. 포인터와 참조자를 구분하자.

by 리뷰하는 (게임)프로그래머_리프TV 2011. 4. 22.


포인터와 참조자의 기본 개념부터 파악해 보자.
여러 좋은 예, 상황에 비유 할 수도 있지만 가장 큰 차이점과, 비슷한 점을 생각해 보았을 때
주소를 통해 접근, 같은 이름공간을 사용한 접근. 이라고 생각한다.

포인터든, 참조자든 사용하는 이유는 말 그대로 다른곳에 저장되어 있는 정보를 접근하여, 변경. 사용하기 위해서라고 생각하는데, 접근 하는 방식이 다르다고 보면 될 것 같다.

1. 참조자는 Null 의 개념이 존재 하지 않는다.
 즉, 생성과 동시에 이미 값이 존재하여야 한다는 것이다.

string& str; // 말도 안되는 사용방법,어차피 되지도 않는다.

string s("test");
string& rstr = s; // 생성과 동시에 값이 존재해야 한다는 것을 기억하자.​


2. 상황에 따른 적절함이 필요 하다.
 

string s1("Test1");
string s2("Test2");

string* ps;
ps = &s1; ps = &s2; // 이처럼 맘대로 변형이 가능하다.(물론 const가 붙어있다면 또 얘기가 다르지만)
string& rs = s1;
// rs를 출력하면 당연히 Test1이 나올것이다.
// 하지만 여기서 함정이 존재한다. 
rs = s2; // 다음처럼 한다면 어떻게 될까?
// rs를 출력하면 Test2가 뜨게 된다.​




이것이 바로 함정이다. string& rs; 를 먼저 보고 생각한다고 하면, rs가 참조하는것을 s1에서 s2로 변형한것 같지만, 사실은 그렇지 않다. s2의 값을 s1에 대입해 버린것이다.

rs, s1, s2를 출력하면 모두다 같은 결과(Test2)가 나올것이다. 잘못됐다는 것이 아니라, 애초에 참조자를 쓴다는것 자체가 같은 이름 공간으로 취급하는 것이기 때문에,
s1 = s2; 를 의도한 것이라면 재대로 한것이 맞지만, 단순히 참조하는 대상을 바꾸기 위해서 사용 하였다면 크게 실수했다는 것이다.

마지막으로, 포인터를 썻을 때 어색해지는 구문일때 참조자를 사용하라고 되어 있지만.
이 부분에 대해서는 지금 구지 집고 넘어갈 필요는 없을 것 같다.