삽질의 현장/- ETC

[삽잡이] 0, NULL, \0?

shovelman 2015. 9. 18. 14:39


안녕하세요 삽잡이입니다.

이번 시간에는 NULL과 0의 차이점에 대해서 알아보려고 합니다.


저와 같은 개발 공부에 관심을 가지고 있는 햇병아리(?)들은 흔히들

char* s = 0; 처럼 변수를 초기화 하곤 합니다.

해당 코드는 '문자열을 담는 변수 s의 주소는 0이다.' 라고 말할 수 있습니다.

그렇다면, char* s = NULL; 과 char* s = 0; 은 과연 어떤 차이가 있을까요?

정답부터 말씀드리자면, 같은 기능을 담당하고 있습니다.

흠... 0과 NULL은 같다는 것처럼 들리는데요?


우선 0은 정수입니다. 맞습니다. 숫자입니다.

NULL은 포인터입니다. 사실 주소는 주소인데 0 주소라고 정의할 수 있습니다.

사실 NULL의 원형은 (void *) 형식으로 정의되어 있다는 말입니다. 

따라서, 주소가 없다라고 말 할 수 있다는 것입니다.


우리는 메모리의 위치를 주소라고 부릅니다.

또한, 해당 주소에는 각각 보관되어 있는 값들이 있을 것입니다.

이때 0 주소를 뜻하는 것이 바로 NULL 이라고 하는 것입니다.


일반적으로 0 주소부터 0xFFFF까지는 예약되어 있는 주소입니다.

사용할 수 없도록 널 포인트 트랩으로 예약되어 있다는 것입니다.

따라서, 사용할 수 없는 주소입니다. 즉, 접근 시도를 할 경우 접근을 할 수 없도록 한다는 것입니다.


다시 말씀드리자면,

char* s = NULL; 이나 char* s = 0; 혹은, int** pp = NULL; 이나 int** pp = 0;

이와 같은 변수 초기화는 모두 같다는 뜻입니다.


위의 초기화에서 0은 0 주소라는 것을 알고 있다는 가정하에 쓰는 초기화라는 것입니다.

NULL은 NULL을 위한 헤더를 incude 해야하기 때문에 요즘은 그냥 0으로 초기화하는 추세라고 합니다.


하지만, 주의해야할 점이 있습니다.

int n = 0; 과 int n = NULL 은 같을까요?

아닙니다. 여기서 int n은 정수 0을 넣으라는 뜻이고, 

후자는 주소 0을 int형 변수에 넣으라는 뜻이기 때문에 이와 같이 사용을 해서는 안됩니다.


이왕 알아보는 김에 \0, NULL 문자열인 "" 도 추가적으로 알아가보도록 하지요...


\0은 널 문자라고 부릅니다. 이 널 문자는 문자열의 끝을 나타냅니다.
\0의 정의 값도 0이기 때문에 즉, 코드 값이 0이기 때문에 또 다시 한번 헷갈리게 됩니다.
0, NULL, \0 ... 죄다 0입니다. 하지만 모두 0이라는 의미는 모두 다릅니다.
순서대로 정수 0, 주소 0, 문자 0 이라는 의미를 가지고 있다는 것입니다.

NULL 문자열은 "" 이렇게 사용하지요... 문자열이 아무것도 없다는 것입니다. 
즉, 내부는 "\0" 이처럼 널 묹자 하나만을 가지고 있는 문자열이라는 것입니다.
따라서, NULL 문자열이 널 하나를 가지고 있다고 해서 NULL 문자열이라고 부릅니다.

char* s = NULL; 과 char* s = ""; 이 두 코드는 같을까요?
아닙니다. 이 두 코드는 완전히 다른 코드 입니다.

전자의 코드는 
문자열을 담을 수 있는 변수 s가 '아무 것도 가리키지 않고 있다'는 뜻입니다.
후자의 코드는
\0 이라는 문자열 하나를 가지고 있는 문자열의 주소를 담고 있습니다.
정리하자면 즉, 전자는 주소를 가리키고 있지 않지만, 
후자는 \0 문자열을 가지고 있는 메모리 주소를 담고 있다는 것입니다.


이처럼 같은 0처럼 보이지만 모두 사용되는 의미는 다릅니다.
언제 어떻게 사용하는 지에 대해서 알고 아름다운 코드를 구현해보도록 합시다.

이상 삽잡이였습니다!