[전문가를 위한 C++] 11장 11.1.6 레퍼런스와 포인터의 선택 기준
결론 :
포인터보다 레퍼런스를 사용하는 것이 좋다. 레퍼런스를 사용할 수 없을 때만 포인터를 사용한다.
레퍼런스를 사용했을때의 장점.
1. 코드를 깔끔하고 읽기 쉽게 작성 할 수 있다.
2. 포인터보다 훨씬 안전하다.
- 레퍼런스의 값은 null이 될 수 없고, 레퍼런스를 명시적으로 역참조 할 수도 없다.
- 그래서 포인터처럼 역참조 과정에서 에러가 발생할 가능성도 없다.(단, 포인터가 하나도 사용되지 않았을때만)
3. 레퍼런스를 초기화한 뒤에는 그 레퍼런스가 가리키는 객체를 변경할 수 없다.
포인터를 사용한 코드는 거의 대부분 레퍼런스로 표현할 수 있다.
심지어 객체에 대한 레퍼런스는 객체에 대한 포인터처럼 다형성도 지원한다.
하지만 반드시 포인터를 사용해야 하는 경우도 있다.
포인터를 사용해야 하는 경우.
1. 가리키는 위치를 변경해야 할 때.
- 레퍼런스 타입 변수는 한 번 초기화되고 나면 그 변수가 가리키는 주솟값을 바꿀 수 없다.
- 동적 할당 메모리의 주소는 레퍼런스가 아닌 포인터에 저장해야 한다.
2. 주솟값이 nullptr이 될수도 있는 optional 타입은 반드시 포인터를 사용해야 한다.
3. 컨테이너에 다형성 타입을 저장할 때도 포인터를 사용해야 한다.
매개변수나 리턴값을 포인터와 레퍼런스 중 어느 것으로 표현하는 것이 적합한지 판단하는 한 가지 방법은,
메모리의 소유권이 어디에 있는지 따져 보는 것이다.
1. 메모리의 소유권이 변수를 받는 코드에 있다면, 메모리를 해제하는 책임은 그 코드에 있으므로
- 객체를 스마트 포인터로 표현한다.
2. 메모리 소유권이 변수를 받는 코드에 없고, 메모리를 해제할 일이 없다면 레퍼런스로 전달한다.