개발 🛠💻/C++, Modern C++

[전문가를 위한 C++] 11장 11.1.6 레퍼런스와 포인터의 선택 기준

승지 T-Story 2023. 4. 9. 21:26
결론 :
포인터보다 레퍼런스를 사용하는 것이 좋다. 레퍼런스를 사용할 수 없을 때만 포인터를 사용한다.

 
레퍼런스를 사용했을때의 장점.
1. 코드를 깔끔하고 읽기 쉽게 작성 할 수 있다.
2. 포인터보다 훨씬 안전하다.
 - 레퍼런스의 값은 null이 될 수 없고, 레퍼런스를 명시적으로 역참조 할 수도 없다.
 - 그래서 포인터처럼 역참조 과정에서 에러가 발생할 가능성도 없다.(단, 포인터가 하나도 사용되지 않았을때만)
 3. 레퍼런스를 초기화한 뒤에는 그 레퍼런스가 가리키는 객체를 변경할 수 없다.

포인터를 사용한 코드는 거의 대부분 레퍼런스로 표현할 수 있다.
심지어 객체에 대한 레퍼런스는 객체에 대한 포인터처럼 다형성도 지원한다.
 
하지만 반드시 포인터를 사용해야 하는 경우도 있다.
 
포인터를 사용해야 하는 경우.
1. 가리키는 위치를 변경해야 할 때.
 - 레퍼런스 타입 변수는 한 번 초기화되고 나면 그 변수가 가리키는 주솟값을 바꿀 수 없다.
 - 동적 할당 메모리의 주소는 레퍼런스가 아닌 포인터에 저장해야 한다.
2. 주솟값이 nullptr이 될수도 있는 optional 타입은 반드시 포인터를 사용해야 한다.
3. 컨테이너에 다형성 타입을 저장할 때도 포인터를 사용해야 한다.
 
 
매개변수리턴값을 포인터와 레퍼런스 중 어느 것으로 표현하는 것이 적합한지 판단하는 한 가지 방법은,
메모리의 소유권이 어디에 있는지 따져 보는 것이다.
 
1. 메모리의 소유권이 변수를 받는 코드에 있다면, 메모리를 해제하는 책임은 그 코드에 있으므로
 - 객체를 스마트 포인터로 표현한다.
2. 메모리 소유권이 변수를 받는 코드에 없고, 메모리를 해제할 일이 없다면 레퍼런스로 전달한다.