이 레슨과 관련된 학습 키워드
컴퓨터 과학 & 프로그래밍 — 문제 해결의 도구 → C++ 프로그래밍 — 성능과 추상화의 균형 → C++ 프로그래밍 — 성능과 추상화의 균형 → C에서 C++로
References vs pointers, namespaces, function/operator overloading, default/delete, lambda, ADL.
오늘은 C++의 참조가 무엇인지 알아보겠습니다.
참조는 기존 변수의 별칭, 즉 alias입니다.
포인터처럼 간접 접근을 제공하지만 중요한 차이가 있습니다.
선언 시 반드시 초기화해야 하고요.
초기화 후에는 다른 대상을 가리킬 수 없습니다.
문법은 타입 뒤에 앰퍼샌드를 붙여서 선언합니다.
그림 왼쪽 상단을 보시면 스택 메모리에서의 참조를 볼 수 있습니다.
변수 a가 주소 0x7FF0에 값 42를 저장하고 있죠.
참조 ref는 별도 메모리 없이 a와 동일한 주소를 공유합니다.
sizeof ref는 sizeof a와 똑같이 4바이트입니다.
이름표, 라벨일 뿐 독립 객체가 아닌 겁니다.
오른쪽을 보시면 포인터는 다릅니다.
ptr은 0x7FF8에 별도 8바이트 메모리를 차지합니다.
값으로 a의 주소인 0x7FF0을 저장하고 있고요.
nullptr도 가능하고, 역참조 문법인 *ptr이 필요합니다.
가운데 비교표를 보시면 차이가 한눈에 정리됩니다.
초기화는 참조가 선언 시 필수, 포인터는 나중에도 됩니다.
재바인딩은 참조가 불가능, 포인터는 가능합니다.
null 허용도 참조는 불가, 포인터는 nullptr이 가능합니다.
접근 문법도 다릅니다. 참조는 ref = 10, 포인터는 *ptr = 10입니다.
하단 왼쪽을 보시면 재바인딩 불가능성 예시가 있습니다.
ref = b라고 쓰면 ref가 b를 가리키는 게 아닙니다.
a의 값이 20으로 바뀌는 겁니다. 이게 핵심 포인트입니다.
참조의 종류는 크게 세 가지입니다.
lvalue 참조, const 참조, 그리고 rvalue 참조입니다.
const 참조는 임시 객체도 바인딩할 수 있습니다.
하단 오른쪽을 보시면, const 참조로 r에 5를 바인딩하면 OK입니다.
일반 lvalue 참조는 리터럴을 받지 못해 컴파일 에러가 납니다.
ISO C++ 규칙에 따라 임시 객체의 수명이 참조 수명까지 연장됩니다.
함수 매개변수로는 const 참조 전달이 가장 권장되는 패턴입니다.
복사 없이 원본을 읽을 수 있어서 효율적이거든요.
마지막으로 댕글링 참조를 꼭 주의해야 합니다.
지역 변수 참조를 반환하면 미정의 동작이 발생합니다.