본문으로 건너뛰기
모던 C++LESSON 04

nullptr: NULL과 0 대신 왜 써야 할까

난이도초급 → 중급 입문
예상 시간45분
선수지식이전 강의

4강. nullptr: NULL과 0 대신 왜 써야 할까

이번 강의에서 해결할 문제​

오래된 C++ 코드에서는 포인터가 없음을 0이나 NULL로 표현합니다. 이 값들은 정수로 해석될 수 있어 함수 오버로드에서 전혀 다른 함수가 선택되거나 포인터 의도가 가려질 수 있습니다.

학습 목표​

  • nullptr가 빈 포인터 전용 리터럴인 이유를 설명합니다.
  • 정수 0과 포인터 오버로드의 차이를 실행 결과로 확인합니다.
  • null 가능 포인터를 사용하기 전에 검사합니다.

먼저 알아야 할 핵심 개념​

포인터는 객체의 주소를 저장하며 아무 객체도 가리키지 않는 상태가 필요할 수 있습니다. nullptr의 타입은 std::nullptr_t이고 필요한 포인터 타입으로 변환됩니다. 정수 0과 의미가 분리되어 컴파일러가 의도에 맞는 함수를 선택할 수 있습니다.

가장 작은 실행 가능한 예제​

nullptr_overload.cpp
#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);
}

핵심 코드 줄별 설명​

  1. 첫 focus는 정수 슬롯 번호를 받습니다.
  2. 두 번째 focus는 플레이어를 관찰하는 포인터를 받습니다.
  3. focus(0)은 정확한 정수 오버로드를 선택합니다.
  4. focus(nullptr)는 포인터 오버로드를 분명하게 선택합니다.
  5. 실제 주소 &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개​

  1. nullptr와 정수 0이 오버로드 선택에서 다른 이유는 무엇인가요?
  2. null이 허용되지 않는 함수 인자에는 어떤 표현이 더 적합한가요?
  3. null 검사는 포인터 사용 흐름의 어느 위치에 있어야 하나요?

핵심 요약​

빈 포인터는 nullptr로 표현해 정수 값과 구분합니다. null 가능성은 함수 계약에 드러내고, 검사 전에 역참조하지 않습니다.

다음 강의 연결​

5강. 중괄호 초기화에서 객체가 처음부터 유효한 값으로 시작하도록 초기화 문법을 정리합니다.

MINI QUIZ

nullptr: NULL과 0 대신 왜 써야 할까 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“nullptr: NULL과 0 대신 왜 써야 할까” 작업 전 검토에서 채택해야 할 안전 기준은 무엇인가요?
  2. 문제 2“nullptr: NULL과 0 대신 왜 써야 할까”의 작업 기준으로 ‘null이면 조용히 무시’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

4강. nullptr: NULL과 0 대신 왜 써야 할까 미완료 상태