포인터 vs 참조형 타입

|

보통 C++ 개발자는 C 언어를 먼저 배우고 나서 C++을 배우는 경우가 많습니다.

C 언어에서 데이터 주소를 넘기는 방법은 포인터(Pointer)밖에 없습니다. 그러다보니 C++에서도 포인터로 데이터 주소를 넘기는 경우가 종종 있는데, 대부분의 경우는 포인터가 아닌 참조형(Reference) 타입으로 대체할 수 있습니다.

포인터대신 참조형 타입을 사용하면 좋은 점들은 다음과 같습니다.

참조형 타입의 장점

참조형 타입은 포인터보다 안전합니다.

왜냐하면 메모리 주소를 직접 다루지 않기 때문에 nullptr 같은 경우가 발생할 수가 없습니다.


코드 스타일이 좋아집니다.

‘*’ 이나 ‘&’와 같은 심볼을 사용하지 않아도 됩니다.

대신 함수 원형을 보지 않고 호출부만 봤을 경우는 매개변수가 값이 복사되서 넘어가는지 주소값만 넘어가는지 알 수 없는 단점이 있습니다. 항상 함수의 선언부를 봐야 알 수 있습니다.


메모리의 오너십(Ownership)이 어디에 있는지 명확하게 해준다.

누군가가 만든 함수에 다른 프로그래머가 참조형으로 객체를 넘겨줄 경우, 그 함수 안에서는 그 객체를 메모리에서 해제할 수 없습니다. 만약 포인터로 넘겨받았을 경우는 메모리 해제의 책임이 변수를 생성한 사람에게 있는지, 그 함수를 작성한 사람에게 있는지 명확하지 않습니다.


미세하지만 참조형 타입이 포인터보다 성능이 더 좋다.

큰 차이는 없습니다. 다만 참조형 타입은 포인터처럼 주소값 복사의 과정이 없기 때문에 성능면에서는 조금 더 좋습니다.