포스트

Go 언어의 nil 이란?

익숙치 않은 키워드, nil

급하게 Go를 배워야하는 상황에서, nil이라는 키워드를 처음 마주쳤을 때 약간 당황했습니다.

도대체 nil이 뭐야…?

1. nil??

Go에서 nil은 명백히 “값이 없다”는 의미를 전달하는 키워드입니다.

네! null과 동일한 의미이죠!

Python에서는 None, Java에서는 null, 그리고 C에서는 NULL이라는 표현과 같은 것이죠.

null은 워낙 여러 언어에서 쓰이니 비개발자들도 익숙한 단어입니다.

또한 Python의 None이나, 의미가 조금 다르긴 하지만 JS의 undefined 같은 경우에는, 그냥 단어 자체를 통해 의미를 추측할 수 있습니다.

그런데 Go는 왜 굳이 단어 자체가 낯선 nil을 쓸까요?

Swift에도 nil 키워드가 있으나, 이는 ‘null 자체를 의미하는 것이 아닌, null일 수도 있음’을 의미한다고 합니다. 반면 Go에서는 null과 동일한 의미입니다!


2. nil의 어원

nil이라는 단어는 라틴어 nihil에서 유래했습니다. 뜻은 “아무것도 없음”입니다.

이 단어는 이후 영국식 영어에서 종종 쓰였고, 수학에서는 0을 의미하거나 무(無)의 개념으로 사용되기도 했습니다.

프로그래밍 언어에서도 초창기부터 nil이라는 표현이 종종 사용되었는데,

특히 Lisp, Smalltalk, Objective-C 같은 언어들이 nil이라는 표현을 채택했습니다!

이와 달리 C 계열 언어들은 NULL, Java와 JavaScript는 null, Python은 None이라는 키워드를 선택했죠.

즉, nil은 단순히 “null의 철자 변형”이 아니라, 나름 근본있는 전통 있는 키워드입니다.


3. Go에서는 왜 null이나 None이 아닌 nil을 쓰는가?

Go는 문법이 간결하고, 읽기 쉬운 코드를 지향합니다.

그렇기 때문에 짧고 의미가 분명한 단어를 선호하는 경향이 있습니다.

추측컨데, 다음과 같은 이유로 nil이 쓰인 게 아닐까 싶습니다.

1
2
3
4
5
6
7
•	이미 C/C++에서 NULL을 경험한 개발자들이 많기 때문에, 이와는 다른 표현이 필요했다?

•	null, None은 다른 언어에서 사용되던 키워드라서 충돌 혹은 혼란을 줄 수 있다.

•	nil은 이미 Lisp이나 Smalltalk에서 “값 없음”의 의미로 쓰였기 때문에, 정체성이 명확했음.

•	무엇보다도 간결함.

그리고 Go 진영에서는 반 쯤 밈으로 쓰이는

1
2
3
if err != nil {
    return nil, err
}

이 코드에 nil 대신 null이 들어갔다면 바이트 낭비가 더 심해졌을 수도 있다(…)라는 의견도 있습니다.

Go에서는 nil이 꽤 다양한 타입에 적용됩니다.

예를 들어 포인터, 슬라이스, 맵, 함수, 인터페이스 등에서도 사용됩니다:

var s []int        // nil slice
var m map[string]int // nil map
var f func()       // nil function
var i interface{}  // nil interface

nil은 타입마다 동작이 조금씩 다르기 때문에, 실제 사용할 땐 주의가 필요합니다.

예를 들어, nil 맵에 값을 넣으면 런타임 에러가 발생하지만, nil 슬라이스에 값을 append하는 것은 가능합니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.