c++/기초

nullptr

코드망령 2026. 6. 5. 09:30

nullptr

포인터 전용 null 값


NULL의 문제점

void func(int x);
void func(int* x);

func(NULL);

NULL은 일반적으로 다음과 같이 정의되어 있다.

#define NULL 0

즉, NULL은 결국 정수 0이다.

따라서

void func(int);
void func(int*);

두 함수 모두 호출 후보가 된다.

  • 0int 변환 가능
  • 0int* 변환 가능

컴파일러는 어떤 함수를 호출해야 하는지 결정할 수 없기 때문에 모호성(Ambiguity) 오류가 발생한다.


nullptr 사용

void func(int x);
void func(int* x);

func(nullptr);

nullptrstd::nullptr_t 타입을 가지는 특수한 값이다.

  • 포인터 타입으로만 변환 가능
  • 정수 타입으로는 변환되지 않음

따라서

func(int*);

만 호출 후보가 된다.

결과적으로 컴파일러는 명확하게 func(int*)를 선택할 수 있으며 모호성 오류가 발생하지 않는다.


nullptr의 특징

int* ptr = nullptr;

nullptr

  • 유효한 메모리를 가리키지 않는 상태를 표현하는 값
  • 포인터 전용 null 값
  • std::nullptr_t 타입을 가지는 특수한 리터럴

이다.


NULL vs nullptr

구분 NULL nullptr
타입 정수(0) std::nullptr_t
정수 변환 가능 불가능
포인터 변환 가능 가능
함수 오버로딩 모호성 발생 가능 발생하지 않음
C++ 권장 여부 비권장 권장

권장 방식

현대 C++에서는 NULL 대신 nullptr 사용을 권장한다.

int* ptr = nullptr;
if (ptr == nullptr)
{
    // 포인터가 아무것도 가리키지 않음
}

포인터가 유효한 객체를 가리키지 않는다는 의미를 명확하게 표현할 수 있으며, 함수 오버로딩에서 발생할 수 있는 모호성 문제도 방지할 수 있다.

'c++ > 기초' 카테고리의 다른 글

extern (외부 변수)  (0) 2026.06.05
분할 구조 (Header / Source File)  (0) 2026.06.05
#define 0 NULL  (0) 2026.06.02
참조자(Reference)  (0) 2026.05.31
포인터  (0) 2026.05.31