C++에서 NULL은 전통적으로 0으로 정의되어 왔습니다. 즉, NULL이나 0은 본질적으로 정수(integer) 값입니다.
포인터에 널 값 할당하기
포인터에 '아무것도 가리키지 않는 상태'를 나타내기 위해 다음과 같이 값을 할당할 수 있습니다.
float* p = NULL; float* p = 0; float* p = nullptr;
세 가지 방식의 차이점
위 세 가지 코드는 모두 포인터를 널 상태로 만든다는 점에서 동일한 결과를 냅니다. 하지만 내부적으로 중요한 차이가 존재합니다.
- NULL: C 언어에서 물려받은 매크로로, 대부분의 컴파일러에서 0으로 정의됩니다.
- 0: 정수 리터럴 그 자체이며, 포인터 문맥에서는 널 포인터로 변환됩니다.
- nullptr: C++11에서 도입된 키워드로, NULL을 대체하기 위해 만들어졌습니다.
nullptr를 사용해야 하는 이유
nullptr는 std::nullptr_t 타입을 가지는 전용 키워드입니다. NULL이나 0은 정수이기 때문에 함수 오버로딩 시 의도치 않게 정수 매개변수 버전이 호출되는 모호성 문제가 발생할 수 있습니다. 반면 nullptr는 오직 포인터 타입으로만 변환되므로 이러한 혼란을 방지하고 타입 안전성을 보장합니다.
따라서 C++11 이상의 환경에서 작업한다면, 가독성과 안전성을 위해 nullptr 사용을 권장합니다.