본문 바로가기
C++

[C++] nullptr과 NULL차이 - nullptr 조건문 사용시 주의사항

by Warehaus 2024. 3. 19.

 

pointing...

 

 

 

 

NULL

 

 

NULL은 C에서 주로 많이 사용하게 되는 값 입니다. 보통 0으로 정의되어 있습니다.

초기화 또는 문자열 끝을 표현하기 위해, 할당 된 값이 없음을 의미하고 싶을 때 보통 사용하게 됩니다.

 

In C, the macro NULL may have the type void*, but that is not allowed in C++ because null pointer constants cannot have that type.

 

C 에서는 NULL은 void* 타입을 갖게된다.  하지만 C++에서는 다르며, 이는 null pointer 상수가 void* 타입을 가질 수 없기 떄문이다.

 

C에서의 NULL type은 void* 입니다.

 

하지만 C++은 조금 다른데요,  C++ 11 이전에는 NULL 매크로를 따로 사용하였지만 C++ 11 즉, 모던 C++에서는 nullptr가 이를 대체하고 있습니다.

 

nullptr 의 타입은 nullptr_t 이며,  널 포인터 상수를 나타내는데 사용합니다.

그리고 C 에서 포인터를 NULL 로 초기화 하듯이 C++에서는 포인터를 nullptr로 초기화 하는게 보통입니다.

 

 

C++에서의 포인터 초기화

 

C에서 포인터를 초기화 하지 않으면 어떻게 될까요?

 

메모리에 뭔가 쓸 자리를 만들어 두기는 했는데 어떤 용도로 쓸 지 알려주지 않으니

용도가 불명확해 집니다. 공간을 치우거나 뭔가 넣은게 없으니 사용할 수 없는 값이 있겠죠?

 

네, 포인터를 초기화  하지 않으면 그 자리에는 쓰레기 값이 입력되어 있습니다.

 

그러면 C++에서는 어떨까요?

cat ptr.cc 
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int *test;
    bool *go;
    double *stop;

    cout << test << endl;
    cout << go << endl;
    cout << stop << endl;

	return 0;
}


$ ./a.out 
0x555e8a5e30c0
0x7ffcd771ed60
0

 

주소 값도 나오고.. 0 도 나오고 다양하게 값이 나오는 것 같습니다.

 

이제 nullptr로 초기화하면 어떤 값이 나오는지 봐야겠지요?

 

 cat ptr.cc 
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int *test = nullptr;
    bool *go = nullptr;
    double *stop = nullptr;

    cout << test << endl;
    cout << go << endl;
    cout << stop << endl;

	return 0;
}

$ ./a.out 
0
0
0

 

출력을 해보니 0이 나오는 것을 알 수 있습니다.

 

nullptr 와 NULL은 다르다?

 

그럼 nullptr와 NULL은 다른걸까요?

조건문을 통해서 확인해보면 아래와 같은 결과를 얻을 수 있었습니다.

 

$ cat ptr.cc 
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int *test = nullptr;
    bool *go = nullptr;
    int *stop = NULL;

    cout << test << endl;
    cout << go << endl;
    cout << stop << endl;

    if ( test == stop )
        cout << "test is equal to stop" << endl;
    else
        cout << "test is not equal to stop" << endl;


	return 0;
}

$ ./a.out 
0
0
0
test is equal to stop

 

적어도 조건문에서는 같은 값인 것으로 확인되네요.

사실 이 결과는 예상 된 결과였습니다.

 

앞에서 이 부분을 언급했기 때문이죠.

 

 C++ 11 이전에는 NULL 매크로를 따로 사용하였지만 C++ 11 즉, 모던 C++에서는 nullptr가 이를 대체하고 있습니다.

 

C++11 에서부터는 NULL이 nullptr를 대체하고 있습니다.

 

 

nullptr를 조건문에서 false 일까? 

 

일반적으로 숫자 값을 이용해서 조건문을 활용할 때,  우리는 0인 경우 false로 판정합니다.

nullptr 도 그럴까요? 한번 확인해 보겠습니다.

 

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int *test = nullptr;
    bool *go = nullptr;
    int *stop = NULL;

    cout << test << endl;
    cout << go << endl;
    cout << stop << endl;

    if ( test == stop )
        cout << "test is equal to stop" << endl;
    else
        cout << "test is not equal to stop" << endl;

    if ( test )
        cout << "nullptr" << endl;
    else
        cout << "nullptr is false" << endl;

    if ( stop )
        cout << "NULL" << endl;
    else
        cout << "NULL is false" << endl;

    if ( 0 )
        cout << "zero" << endl;
    else
        cout << "non-zero" << endl;

	return 0;
}

 

실행해 보니 아래와 같은 결과를 얻었습니다.

0
0
0
test is equal to stop
nullptr is false
NULL is false
non-zero

 

숫자값과 동일하게 nullptr를 false 로 인식하네요.

 

그렇다면.. !nullptr은 어떻게 판정할까요?

예상한 대로 숫자값과 동일하게 동작한다는 것을 확인했습니다.

 

$ cat ptr.cc 
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    int *test = nullptr;
    bool *go = nullptr;
    int *stop = NULL;

    cout << test << endl;
    cout << go << endl;
    cout << stop << endl;

    if ( test == stop )
        cout << "test is equal to stop" << endl;
    else
        cout << "test is not equal to stop" << endl;

    if ( !test )
        cout << "nullptr" << endl;
    else
        cout << "nullptr is false" << endl;

    if ( !stop )
        cout << "NULL" << endl;
    else
        cout << "NULL is false" << endl;

    if ( !0 )
        cout << "zero" << endl;
    else
        cout << "non-zero" << endl;

	return 0;
}


$ ./a.out 
0
0
0
test is equal to stop
nullptr
NULL
zero

 

 

 

 

 

C++ 공부하시면서 궁금한 점이 있으시면 방명록에 남겨주세요.

제가 확인하면서 추가 포스팅을 진행할수도 있고, 바로 답변드릴 수도 있을 것 같습니다.

읽어주셔서 감사합니다.

 

 

C와 C++이 백악관에서 더 이상 사용하지 않게 된 이유

 

C와 C++이 백악관에서 더 이상 사용하지 않게 된 이유

C와 C++을 그만 사용해야 하는 이유 최근 ciokorea.com 에서 발행한 뉴스기사 중 재밌는 글을 보았다. 제목은 백악관, 'C'와 'C++' 사용 중단 촉구··· 전문가들 "시의적절한 권고" 였는데, 사실 예전부

armin.tistory.com

 

[C++] gdb이용하여 thread 분석하기

 

[C++] gdb이용하여 thread 분석하기

C++ 프로그래밍을 하면서 디버깅은 어떻게 해야 할까요? 윈도우에서는 Visual Studio 라는 IDE를 통해 수월하게 디버깅이 가능하지만, 리눅스에서는 그렇지 않습니다. 리눅스 터미널에서는 디버깅 시

armin.tistory.com