INTRO

개발자로 일하다 보면 반드시 NULL 이라는 것과 마주하게 된다. 데이터 분석에서든, 데이터베이스에서든, 변수에 할당되는 값에서든 NULL은 도처에 자리하고 있다.

이번 포스팅에서는 NULL의 정확한 의미와 어원, 특징, 그리고 다양한 사례들을 살펴보고, NULL을 다룰 때 발생할 수 있는 문제와 그 해결 방법에 대해서 알아보고자 한다. 이를 통해 NULL에 대한 명확하고 깊이 있는 이해를 돕고, 실무에서 이를 올바르게 활용하는 데 필요한 지식을 알아보고 기록해보자.

NULL

NULL 의 의미

존재하지 않음 혹은 값을 알 수 없음 이라는 특수한 상태를 가리키는 개념이다. NULL은 0이 아니며, 공백도 아닌 특수한 상태 혹은 상태값을 가리킨다.

실제 상황에서의 예시

예를 들어 데이터베이스 employee 테이블에 각 사원의 연봉 값이 들어있는 연봉 컬럼이 있다고 가정해보자. 신입 사원인 A 씨는 이제 막 회사와 고용 계약을 하고, 연봉 협상은 하기 전인 상황이다. 이럴 때 데이터베이스에서 신입 사원 A씨의 연봉 컬럼에는 무슨 값을 입력해야 할까?

이 때 사용할 수 있는 게 바로 NULL 이다. NULL 은 존재하지 않음 혹은 값을 알 수 없음 이라는 특수한 상태를 가리키는 개념으로, A 씨의 연봉은 아직 알 수 없으므로 NULL 로 처리해야 타당한 것이다. 아직 연봉을 모른다고 0으로 처리하면 무급으로 일한다 라는 잘몬된 정보가 생성되므로, 0으로 처리하면 안된다.

NULL 의 어원

NULL은 라틴어에서 ‘아무것도 아니다’ 혹은 ‘없다’ 등의 으미를 가진 nullus라는 단어에서 부터 유래되었다. NULL은 무언가의 약어가 아니고, 그 자체로 단어이다.

NULL 의 표기법

NULL은 문자나 어떤 시각적인 표현과 같은 표기법이 정해지지 않았다. 개념적으로 정의되어있고, 각 프로그래밍 언어나 툴에서 각기 다른 다양한 형태로 표현되고 있다.

언어/상황 표기법
아스키코드 \0
C, C++ NULL
Python None
Java null
JavaScript null
PHP NULL
JSON null
엑셀 비어있음
데이터베이스 NULL
dbeaver 조회화면 [NULL]

NULL 의 특징

특징 설명
NULL은 값이 아니다. NULL은 존재하지 않음 혹은 값을 알 수 없음이라는 상태를 가리키는 개념이다. 이를 값으로 간주하지 않는다.
비교 불가능 NULL 과 NULL을 비교하면 True 가 아닌 Unknown(알 수 없음)으로 간주된다.
즉, NULL = NULL 의 결과는 NULL 이 된다.
데이터 타입에 독립적이다. NULL은 숫자형, 문자형, 날짜형 등 모든 데이터 타입에서 사용 가능하다.
NULL 의 연산 결과는 NULL NULL 과의 연산 결과는 항상 NULL 이다. 10 + NULL = NULL

NULL과 공백, 0의 차이

구분 NULL 공백(“”) 0
정의 값이 없거나 값을 모르는 상태 값이 있지만 비어 있는 문자열 값이 0인 숫자
데이터 타입 모든 데이터 타입에서 사용 가능 문자열 데이터 타입에서만 사용 가능 숫자 데이터 타입에서만 사용 가능
비교 연산 NULL 과의 연산 결과는 NULL ”” = “” -> True 0 = 0 -> True
예시 고객의 이메일 NULL : 이메일 모름 고객 상담 내용이 “” -> 아무 말도 하지 않음 고객의 나이가 0 -> 0세

NULL의 사례

데이터베이스에서의 NULL

표현 방식 : NULL (대소문자 구분하지 않음)
의미 : 값이 정의되지 않음. 또는 비어 있음.

1
2
SELECT * FROM tbl WHERE col1 IS NULL;           -- col1 컬럼의 값이 비어있는 레코드 조회
INSERT INTO tbl(col1, col2) VALUES (1, NULL);   -- NULL 값 INSERT

Python

표현 방식 : None

1
2
3
a = None
if a is None:
    print("a 는 None 입니다.")

Java

표현 방식 : null

1
2
3
4
String str = null;
if (str == null) {
    System.out.println("str 은 NULL 입니다.");
}

C / C++

표현 방식 : NULL

1
2
3
4
int* ptr = NULL;
if (ptr == NULL) {
    printf("포인터는 NULL 입니다.");
}

Javascript

표현 방식 : null

1
2
3
4
let value = null;
if (value == null) {
    console.log("vlaue 는 NULL 입니다.");
}

PHP

표현 방식 : NULL

1
2
3
4
$var = NULL;
if (is_null($var)) {
    echo "변수는 null 입니다.";
}

JSON

표현 방식 : null

1
2
3
4
{
    "name" : "홍길동",
    "age" : null
}

NULL 문자

NULL 문자는 아시크코드에서 제어 문자 중 하나로, 값이 없음을 나타내며 주로 문자열의 끝을 나타내거나 값이 없는 빈 상태를 표시하는 데 사용된다.

NULL 문자는 화면에 출력되지 않는 제어문자로, 사용자가 입력하거나 볼 수 없는, 특별한 용도로 예약된 문자이다. 아스키코드에서는 0, 이스케이프 문자로는 \0, 16진수로는 0x00 과 같이 표기된다.

C와 같은 언어에서는 문자열 종료 문자로 사용되며, 예를 들어 "HELLO" 라는 문자열은 실제로 메모리에 H, E, L, L, O, NULL 로 저장된다.

문자열의 종료 등의 의미를 가지는 NULL 문자열을 누락하는 경우, 문자열이 끝나지 않는 버퍼 오버플로우 문제가 발생할 수 있다.

NULL 을 다룰 때 주의할 점

(1) NULL 값 연산의 결과는 NULL

NULL 과의 연산 결과는 항상 NULL 이므로, 데이터 조회나 처리에서 누락이 발생할 수도 있다. 따라서 NULL 이 포함된 데이터를 처리할 때에는 항상 주의하고, NULL 값 처리 방법에 따라 처리하여야 한다.

SQL

SQL 에서는 COALESCE 혹은 NVL 을 통해 NULL을 처리할 수 있다.

1
2
3
4
5
6
7
8
9
-- NULL 이 포함된 사칙연산
SELECT 123 + 123;               -- 246
SELECT NULL + 123;              -- NULL
SELECT COALESCE(NULL, 0) + 123; -- 123 (NULL 인 경우 0으로 대체)

-- NULL 이 포함된 비교연산  
SELECT 'Hello' = 'Hello';       -- 1 (True)
SELECT NULL = 'Hello';          -- NULL
SELECT NVL(NULL, '') = 'Hello'; -- 0 (False)
1
2
3
-- NULL이 포함된 컬럼에 대한 COUNT
SELECT COUNT(IndepYear) FROM country;           -- 192
SELECT COUNT(NVL(IndepYear, 0)) FROM country;   -- 239

python

1
2
3
4
5
6
7
8
9
10
11
# NULL 과 사칙연산
a = None
b = 1
print(a + b)
>> TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

# NULL 과 비교연산
a = None
b = 1
print(a == b)
>> False

(2) NULL 과의 비교연산

DBMS 에서 NULL 에 대한 비교연산을 할 때에는 = 이나 != 가 아닌 IS NULL 이나 IS NOT NULL을 사용한다.

1
2
3
4
5
SELECT NULL = NULL;     -- NULL
SELECT NULL IS NULL;    -- 1 (True)

SELECT NULL != NULL;        -- NULL
SELECT NULL IS NOT NULL;    -- 0 (False)

Reference

etymonline - NULL의 어원
wikipedia - null 문자
mysql - world 데이터셋