🤔 C++ 11에 추가된 nullptr과 NULL은 어떻게 다를까?
결론 : 간단히 말하면 NULL은 정수타입의 0, nullptr은 가르키는 것이 없는 포인터 타입이다.
NULL
NULL은 포인터일까? 답은 아니다. NULL은 전처리단계에서 0 으로 치환되는 #define 지시어일 뿐이다. 일종의 매크로로 정수 0일 뿐이다.
💭 여기서 이것이 무엇이 문제인지 생각해보자.
NULL이 정수 0인게 왜? 따라갈 포인터도없으니 댕글링 현상도 없고 괜찮지 않을까?
✔️ 함수 오버로딩에서 NULL을 사용하면, 정수와 포인터를 구분하지 못해 혼란을 일으킬 수 있다.
nullptr
그래서 nulptr이라는게 생겼다. nullptr는 C++11에서 도입된 키워드로, 포인터 타입을 명확하게 나타낸다. nullptr는 std::nullptr_t
라는 전용 타입을 가지며, 타입 안전성을 제공한다. 따라서 포인터를 요구하는 함수에 nullptr를 전달하면, 명확하게 포인터로 인식된다. 이 덕분에 코드의 가독성과 안정성이 향상된다.
이 코드를 보면 왜 생겼는지 이해하기 더 쉬울 것 같다.
void func(char* str){ std::cout << "char* version" << "\n"; }
void func(int i){ std::cout << "int version" << "\n"; }
int main()
{
func(NULL);
func(nullptr);
return 0;
}
위 코드를 보면 인자가 NULL일 때는 정수 0으로 치환되기 떄문에 "int version"이 결과로 나온다.