Null

내위키
Dennis (토론 | 기여)님의 2020년 12월 19일 (토) 00:51 판 (새 문서: 사전에서 찾아보면 '아무런 가치가 없는 것'을 뜻하는 형용사다. 컴퓨터 프로그래밍에서 자주 만나볼 수 있는 값이자, 온갖 버그를 일...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

사전에서 찾아보면 '아무런 가치가 없는 것'을 뜻하는 형용사다.

컴퓨터 프로그래밍에서 자주 만나볼 수 있는 값이자, 온갖 버그를 일으키는 만악의 근원으로 찍혀 있는 값이기도 하다. 오죽하면 알골 언어를 디자인하면서 널 값을 처음으로 고안했던 Null의 아버지 토니 호어가 이를 두고 'The Billion Dollar Mistake(10억 달러짜리 실수)'라고 할 정도다. 알골을 선언할 때 아직 변수가 들어갈 값이 없는 상황을 좀 쉽게 해결하자는 마음에 널 참조를 허용했는데 이 때문에 수십 년 동안 일어난 문제가 'billion dollar' 수준으로 손해가 될 만큼 엄청나다는 것을 뜻하는 말.

0과는 다르다. 0이라는 것은 정수든 부동소수점이든 0이라는 값을 뜻하지만 Null은 그냥 아무 값이 없는 값을 뜻한다.

비슷한 뜻을 가진 명사인 'nil'을 사용하는 언어도 있다. Go, Lua, LISP 같은 언어들이 nil을 사용한다.

굉장히 남용하기 쉽다. 예를 들어 어떤 함수가 결과값을 돌려줘야 하는데 내부에서 오류가 일어났다든가, 처리에 실패했다든가 해서 돌려줄 값이 없다면? 그냥 편하게 null을 돌려주면 된다. 변수를 정의했는데 실제 변수에 들어가는 값은 이후 처리를 통해 만들어진다. 그럼 변수 초깃값으로 뭘 주지? 그냥 null을 넣자. 이래저래 뭐 넣거나 돌려줄 게 마땅치 않으면 속 편하게 null로 해결하면 된다.

문제는 이 값을 사용하는 쪽에서 종종 벌어진다. 예를 들어 함수를 사용하는 쪽에서 null 값이 왔는지 제대로 체크하지 않고 값을 쓰면 오류가 터진다. 변수 역시도 null 상태인 녀석을 그냥 썼다가 역시 오류가 터지는데, C처럼 포인터의 자유도가 높은 언어라면 그야말로 무슨 일이 터질지 모르는 시한폭탄을 들고 있는 것이나 마찬가지다. 정확하게 처리하면 되는 거잖아, 하고 생각할 수 있지만 프로그램의 덩치가 커질수록 그렇게 꼼꼼하게 체크하는 게 쉬운 일도 아니며, 함수 하나 쓸 때마다, 변수 하나 쓸 때마다 일일이 null 여부를 확인하는 것도 쓸데없는 코드가 너무 많아진다. 특히 남이 만든 함수나 라이브러리를 사용할 때 문서화가 제대로 안 되어 있으면 멋모르고 썼다가 버그와 오류가 발생한다. 그래서 null 값을 고안했던 토니 호어가 'The Billion Dollar Mistake'라고 한 것이다.

최근의 언어들은 이러한 null 문제를 줄이기 위해 널 안전성에 신경을 쓰고 있다. 아예 null 값을 못 쓰는 언어가 있는가 하면 변수를 정의할 때 null 값을 쓸 수 있다고 명시하지 않으면[1] null 값을 대입하지 못하게 하기도 한다. 또한 null 값인지 여부에 따라 처리를 다르게 하는 연산자를 통해 null 여부 체크를 위한 코드가 길어지지 않게 도와주기도 한다. 코틀린, Dart와 같은 언어들은 null 값을 허용하지만 각자의 방법으로 널 안전성을 지원한다.

각주

  1. 이를 nullable(null+able)이라고 한다.