Go에는 변수 값이 비어 있거나 null이거나 undefined라는 개념이 없어요. 명시적인 초깃값 없이 선언한 변수는 해당 타입의 제로 값이 돼요.
불리언, 숫자 타입, 문자열 같은 기본 타입의 제로 값은 각각 false, 0, ""예요.
0을 의미하는 식별자 nil은 포인터, 함수, 인터페이스, 슬라이스, 채널, 맵처럼 더 복잡한 타입의 제로 값이에요.
다음 표는 Go 타입들의 제로 값을 정리한 거예요.
| 타입 | 제로 값 |
|---|---|
| 불리언 | false |
| 숫자 | 0 |
| 문자열 | "" |
| 포인터 | nil |
| 함수 | nil |
| 인터페이스 | nil |
| 슬라이스 | nil |
| 채널 | nil |
| 맵 | nil |
위 표에 구조체 타입이 없다는 걸 눈치챘을지도 몰라요. 구조체 타입의 제로 값은 필드에 따라 달라지기 때문이에요. 구조체는 모든 필드가 각각의 제로 값으로 설정될 때 제로 값이 돼요.
다가오는 인구 조사를 위해 도시의 IT 시스템을 준비하는 것이 이번 임무예요. 특히, 인구 조사원들이 수집한 데이터를 처리할 프로그램을 맡게 돼요.
이 프로그램은 주민의 정보를 받으면 시스템에 새로운 주민을 만들 수 있어야 해요. 또한 주민 데이터에 필수 정보가 들어 있는지 확인하는 함수와 주민 데이터를 삭제하는 함수도 만들 거예요. 마지막으로 정확한 인구 조사 결과를 얻기 위해 주민 수를 세게 돼요.
인구 조사원이 주민의 정보를 수집할 때는 그 주민의 이름, 나이, 주소를 시스템에 입력해서 등록해야 해요.
세 개의 인자를 받는 NewResident 함수를 구현해요:
이 함수는 이 정보를 담은 Resident 구조체에 대한 포인터를 반환해야 해요.
name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}
NewResident(name, age, address)
// => &{Matthew Sanabria 29 map[street:Main St.]}
주민들은 인구 조사원에게 개인 정보를 제공하기를 꺼릴 수 있어요. 이럴 때는 주민이 인구 조사에 집계되기 위해 필요한 정보를 제공했는지 판단해야 해요.
인구 조사에 집계되려면 주민은 이름에 0이 아닌 값을 제공해야 하고, 주소에는 street 키에 0이 아닌 값이 들어 있어야 해요.
주민의 나이 같은 다른 정보는 모두 선택 사항이에요.
주민이 필수 정보를 제공했는지 나타내는 불리언을 반환하는 HasRequiredInfo 메서드를 구현해요.
name := "Matthew Sanabria"
age := 0
address := make(map[string]string)
resident := NewResident(name, age, address)
resident.HasRequiredInfo()
// => false
세상은 빠르게 변하고 실수도 생기기 마련이에요. 주민이 도시를 떠날 수도 있어요. 인구 조사원이 데이터를 수집하다 실수할 수도 있고요. 이럴 때는 그 주민이 집계되지 않도록 주민의 데이터를 삭제할 수 있어야 해요.
주민의 모든 필드를 제로값으로 설정하는 Delete 메서드를 구현해요.
name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}
resident := NewResident(name, age, address)
fmt.Println(resident)
// Output: &{Matthew Sanabria 29 map[street:Main St.]}
resident.Delete()
fmt.Println(resident)
// Output: &{ 0 map[]}
이제 시스템이 인구 조사 데이터를 다룰 수 있으니, 인구 조사를 실제로 수행하고 주민 수를 세어 볼 차례예요!
하나의 인자를 받는 Count 함수를 구현해요:
Resident 구조체에 대한 포인터의 슬라이스이 함수는 인구 조사에서 집계된 주민 수를 나타내는 정수를 반환해야 해요. 주민은 인구 조사원에게 필수 정보를 제공한 경우에만 집계될 수 있어요.
name1 := "Matthew Sanabria"
age1 := 29
address1 := map[string]string{"street": "Main St."}
resident1 := NewResident(name1, age1, address1)
name2 := "Rob Pike"
age2 := 0
address2 := make(map[string]string)
resident2 := NewResident(name2, age2, address2)
residents := []*Resident{resident1, resident2}
Count(residents)
// => 1
Exercism에 가입하고 Go 트랙을 개념 34개연습 문제 166개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.