Pointer vs Reference

참조자는 필수 대상, 포인터는 선택 가능한 주소를 표현한다

둘 다 다른 값을 간접적으로 다루지만, 코드가 독자에게 약속하는 의미가 다릅니다. 존재가 보장되면 참조자, 없을 수도 있거나 대상을 바꿔야 하면 포인터가 더 정확합니다.

참조자

T& ref = obj;
계약대상이 반드시 존재한다.
변경원본을 직접 읽고 쓴다.
제약다른 대상에 다시 묶이지 않는다.

포인터

T* ptr = &obj;
계약null일 수 있음을 확인해야 한다.
변경주소를 바꿔 다른 대상을 가리킬 수 있다.
제약접근 전 역참조와 유효성 판단이 필요하다.

const 참조

const T& ref
계약복사 없이 읽기만 한다.
변경함수 내부에서 원본 수정을 막는다.
제약큰 객체 입력에서 가장 흔한 읽기 전달 방식이다.
항상 존재하는 원본을 바꾼다T&를 사용해 수정 의도를 드러냅니다.
없을 수도 있거나 대상을 바꾼다T*를 사용해 null과 주소 변경을 코드로 표현합니다.
큰 객체를 읽기만 한다const T&로 복사 비용과 수정 위험을 함께 줄입니다.