제로 값
제로 값 (The zero value)
변수를 선언하고 값을 넣어 주지 않으면 어떻게 될까요? Go에서는 그 변수가 그냥 "비어 있는" 상태로 남는 게 아니라, 자료형에 따라 정해진 기본값이 자동으로 들어가요. 이 기본값을 바로 제로 값(zero value) 이라고 불러요. 지금부터 그 기본값이 무엇이고, 언제, 어떻게 적용되는지 하나씩 살펴볼게요.
출처: Go Specification
본문
변수에 저장 공간이 할당될 때 — 선언을 통해서든, new를 호출해서든 — 또는 새로운 값이 만들어질 때 — 합성 리터럴(composite literal)이나 make 호출을 통해서든 — 명시적인 초기화가 제공되지 않으면, 그 변수나 값에는 기본값(default value)이 주어져요. 이때 변수 또는 값의 각 요소는 그 자료형에 맞는 제로 값으로 설정돼요. 자료형별 제로 값은 이렇게 정리할 수 있어요.
- 불리언(boolean)은
false - 숫자형(numeric)은
0 - 문자열(string)은
"" - 포인터, 함수, 인터페이스, 슬라이스, 채널, 맵은
nil
이 초기화는 재귀적으로 일어나요. 예를 들어 구조체 배열의 각 요소는, 명시된 값이 없으면 그 구조체의 필드들이 하나씩 제로 값으로 채워지죠.
이 두 단순한 선언은 서로 완전히 동등해요:
var i int
var i int = 0
이렇게 new로 만든 경우도 마찬가지예요.
type T struct { i int; f float64; next *T }
t := new(T)
new(T)는 T 타입의 메모리를 할당하고 제로 값으로 초기화한 뒤 그 포인터를 돌려주거든요. 그래서 위 코드 다음에 아래 관계가 모두 성립해요.
t.i == 0
t.f == 0.0
t.next == nil
new를 쓰지 않고 변수 선언만으로도 똑같은 결과를 얻을 수 있어요. 아래 선언 뒤에도 방금과 동일한 조건이 그대로 성립하죠.
var t T
이처럼 명시적 초기화가 없으면 Go가 자료형에 맞는 제로 값을 자동으로 넣어 준다는 점, 그리고 그 초기화가 필드 단위로 재귀적으로 이뤄진다는 점을 기억하면 지금의 선언과 초기화 흐름을 이해하는 데 큰 도움이 돼요.
더 알아보기
- 변수(Variables) — 선언 시점에 어떻게 공간이 할당되는지
- 패키지 초기화(Package initialization) — 패키지 수준 변수의 초기화 순서