nullptr: NULL과 0 대신 왜 써야 할까
4강. nullptr: NULL과 0 대신 왜 써야 할까
이번 강의에서 해결할 문제
오래된 C++ 코드에서는 포인터가 없음을 0이나 NULL로 표현합니다. 이 값들은 정수로 해석될 수 있어 함수 오버로드에서 전혀 다른 함수가 선택되거나 포인터 의도가 가려질 수 있습니다.
학습 목표
nullptr가 빈 포인터 전용 리터럴인 이유를 설명합니다.- 정수 0과 포인터 오버로드의 차이를 실행 결과로 확인합니다.
- null 가능 포인터를 사용하기 전에 검사합니다.
먼저 알아야 할 핵심 개념
포인터는 객체의 주소를 저장하며 아무 객체도 가리키지 않는 상태가 필요할 수 있습니다. nullptr의 타입은 std::nullptr_t이고 필요한 포인터 타입으로 변환됩니다. 정수 0과 의미가 분리되어 컴파일러가 의도에 맞는 함수를 선택할 수 있습니다.
가장 작은 실행 가능한 예제
#include <iostream>
struct Player {};
void focus(const int slot) {
std::cout << "slot " << slot << '\n';
}
void focus(const Player* player) {
std::cout << (player == nullptr ? "no player" : "player") << '\n';
}
int main() {
Player hero;
focus(0);
focus(nullptr);
focus(&hero);
}
핵심 코드 줄별 설명
- 첫
focus는 정수 슬롯 번호를 받습니다. - 두 번째
focus는 플레이어를 관찰하는 포인터를 받습니다. focus(0)은 정확한 정수 오버로드를 선택합니다.focus(nullptr)는 포인터 오버로드를 분명하게 선택합니다.- 실제 주소
&hero를 넘기면 null 검사를 통과합니다.
실행 결과와 값 변화
slot 0
no player
player
nullptr는 대상이 없다는 뜻이고 0은 유효한 슬롯 번호입니다. 두 상태를 같은 표기로 쓰지 않으면 호출부만 보아도 의도를 알 수 있습니다.
단계별 실습
실습 목표
선택된 적이 없을 수 있는 함수를 안전하게 호출합니다.
시작 전 상태와 실행 방법
Enemy 구조체와 printTarget(const Enemy*) 함수를 새 콘솔 파일에 준비합니다.
1단계: 최소 코드 작성
인수가 nullptr이면 no target을 출력하고 즉시 반환합니다.
2단계: 값 또는 조건을 바꿔 결과 비교
실제 Enemy 주소와 nullptr를 번갈아 전달해 두 경로를 확인합니다.
3단계: 작은 기능 확장
반환값을 bool로 바꾸어 대상 출력 성공 여부를 호출자에게 알립니다.
4단계: 스스로 해결하기
null이 절대 허용되지 않는 함수에는 포인터 대신 참조를 받을 수 있는지 판단하고 시그니처를 바꾸세요.
막혔을 때
nullptr를 알 수 없다는 오류가 나면 C++11 이상 표준으로 빌드 중인지 확인합니다. 포인터를 역참조하기 전에 if (pointer == nullptr) 검사가 먼저 실행되어야 합니다.
흔한 실수와 해결 방법
- 검사 전에
*pointer사용: null 검사 뒤에만 멤버와 값을 읽습니다. - 모든 인수를 포인터로 설계: 대상이 반드시 있어야 하면 참조가 계약을 더 잘 표현합니다.
- null이면 조용히 무시: 호출자가 구분해야 하는 실패라면
bool이나optional등 결과를 반환합니다.
게임 개발 연결
현재 타깃, 장착 아이템, 상호작용 대상은 없을 수 있습니다. Unreal의 UObject 포인터도 null 검사가 필요하지만, 유효성에는 엔진의 객체 수명 규칙이 추가되므로 단순 nullptr 비교만으로 충분한지 API 계약을 확인해야 합니다.
이해 점검 질문 3개
nullptr와 정수 0이 오버로드 선택에서 다른 이유는 무엇인가요?- null이 허용되지 않는 함수 인자에는 어떤 표현이 더 적합한가요?
- null 검사는 포인터 사용 흐름의 어느 위치에 있어야 하나요?
핵심 요약
빈 포인터는 nullptr로 표현해 정수 값과 구분합니다. null 가능성은 함수 계약에 드러내고, 검사 전에 역참조하지 않습니다.
다음 강의 연결
5강. 중괄호 초기화에서 객체가 처음부터 유효한 값으로 시작하도록 초기화 문법을 정리합니다.
nullptr: NULL과 0 대신 왜 써야 할까 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.