(포스팅 2022.10.05)
NULL 값은 코드의 종류에 관계없이 '0'을 말합니다.
오늘 수업을 하다가 'NULL을 어떻게 설명할 것인가'에 대해 토의를 하게 되었습니다.
이 포스팅의 모든 내용은 저의 의견 또는 상상입니다.
저의 경우는 '컴퓨터공학+전자공학'을 전공하여 컴퓨터 내부의 구조에 대해 어느 정도 지식을 가지고 있으므로, NULL에 대해 비교적 쉽게 이해한 것 같습니다. 그럼에도 모르는 사람에게 설명하려면 어려운 것은 사실입니다.
왜 다른 숫자가 아닌 0으로 정했을까요? 0xFFFF를 사용할 수도 있고 -1을 사용할 수도 있었을 것입니다. 또는 null에 해당하는 전용 bit를 설정할 수도 있습니다. 왜 굳이 0이 선택되었을까요?
저는 0이 선택된 이유를, 다음과 같다고 생각합니다.
컴퓨터의 조건문은 연산결과가 0일때 FALSE로, 그 외의 경우는 TRUE 로 판단합니다.
두개의 숫자가 동일한가 비교할때, xor 연산을 하여 결과가 0일때 동일하다고 판단합니다.
초기의 컴퓨터는 논리회로를 적게 사용하여야 했으므로, 조건문에 해당하는 회로를 만들때 기준을 최대한 적은 회로로 판단 가능한 '0'을 사용했을 것입니다. 모든 bit를 OR연산해서 0인가 아닌가를 판단하도록 회로를 구성하는 것이 비용을 가장 아낄 수 있는 방법이었으리라 생각합니다.
간단하게 비교를 하면 다음과 같습니다.
ㅇ 숫자 0 을 확인하는 방법
- 연산기에 값을 로딩한다 -> 모든 bit를 OR한다 -> 결과값이 0인가 확인
ㅇ 0외의 숫자인지를 확인하는 방법
- 연산기에 대상값과 비교값을 로딩한다 -> 두 값을 XOR 연산한다 -> 결과가 숫자 0인지를 확인한다.
정리하면, 어떤 조건을 판단할 때 0인지를 판단하는 것이 가장 경제적인 방법이라고 생각합니다.
C언어를 예를 들어, 변수에 NULL이 들어있는지를 확인하는 코드를 보겠습니다.
ㅇ NULL이 0이 아닌 x인 경우, 변수 var이 NULL인지를 확인하는 코드
if( var==NULL )
ㅇ NULL이 0인 경우, 변수 var이 NULL인지를 확인하는 코드
if( !var )
NULL이 0인 경우에, (가독성은 떨어지지만) 코드를 훨씬 짧게 쓸 수 있습니다.
물론 이것은, 컴퓨터의 성능이 부족해서 코드를 절약하고 쥐어짜야 하는 시대의 이야기입니다. 시간이 지나서 언어의 종류가 많아지고 컴퓨터보다 개발자 친화적이 되면서, 지금은 NULL의 사용법이 통일되지 못하고 혼란스럽습니다.
오늘 배운 수업에서, NULL은 다음과 같은 용도로 사용되었습니다.
포인터 변수를 선언할 때, 초기값이 없다면 꼭 NULL을 넣어라.
제가 생각하는 의견은 이렇습니다.
메모리 주소 0은 보통 CPU레벨에서 특별한 의미로 사용되므로, 잘 사용되지 않는다.
메모리 주소에 잘못된 값이 들어있을 경우, 디버깅이 너무 어렵다.
메모리 주소를 저장하는 변수에 가비지값이 들어있을 경우, 문제가 발생하면 디버깅이 너무 어렵다.
메모리 주소를 저장하는 변수에 가비지값이 들어가지 않도록, 초기값이 없다면 NULL이라도 넣자.
그래서 NULL의 의미는,
가비지값이 아니라는 표시를 하기 위해, 일반적으로 사용되지 않는 값인 0을 초기값으로 무조건 넣자고 프로그래머들끼리 약속을 했다. 이 0을 NULL로 부른다.
예상치 못해 갑작스럽긴 했습니다만, NULL에 대해 열띤 토의를 하며 즐거운 시간을 가졌습니다.
NULL을 보면... 세상이 놀랍도록 변화하고 있음을 새삼 느낍니다. 제가 NULL을 배울 때는 '그냥 그런게 있구나' 했는데, 지금은 NULL null nil NaN 등 온갖 파생이 발생했고, 프로그래밍을 배우는데 어려움을 더하고 있네요.
이런 류의 질문 중 또하나의 예가 생각나네요.
goto문이 존재해야 하는가
아무튼 프로그래밍은 재미있습니다.
포스팅은 여기까지입니다.
언제나 감사드립니다.
(C언어) scanf와 fgets 함수를 같이 사용하면 입력 오류 발생 (0) | 2022.10.11 |
---|---|
(C언어) ARRAY_SIZE()로 배열크기 측정 시 유의점 (0) | 2022.10.07 |
C와 다른 언어의 차이점 (0) | 2022.04.12 |
C# 여러 커맨드를 한번에 실행 (0) | 2022.04.08 |
c# 문자열을 라인별로 분리하는 방법 (0) | 2022.04.08 |
댓글 영역