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++/STL] How to find the size, length of a vector (0) | 2024.04.21 |
---|---|
C++ extern 개념, 사용방법 정리 (0) | 2024.04.21 |
C와 C++이 백악관에서 더 이상 사용하지 않게 된 이유 (0) | 2024.03.17 |
[C++] const 의 개념 그리고 포인터 에서의 const (0) | 2022.03.27 |
[C++/STL] vector의 크기, length 를 구하는 방법 (0) | 2021.11.29 |