제로 값과 기본값
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 107개 중 17번째.
Go에서 모든 변수는 제로 값(zero value)을 가집니다. 이는 명시적인 초기화 없이 변수를 선언할 때 할당되는 기본값입니다. 초기화되지 않은 필드는 자동으로 이러한 기본값을 받기 때문에, 구조체(structs)를 다룰 때 제로 값을 이해하는 것이 필수적입니다.
각 타입은 고유한 제로 값(zero value)을 가집니다:
| 타입 | 제로 값 |
|---|---|
| int, float64 | 0 |
| string | "" (빈 문자열) |
| bool | false |
| pointer, slice, map | nil |
구조체를 생성할 때, 명시적으로 설정하지 않은 모든 필드는 해당 타입의 제로 값(zero value)을 갖게 됩니다.
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (빈 문자열)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}이는 부분 초기화에도 적용됩니다. 지정한 필드만 사용자 정의 값을 갖게 됩니다.
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
제로 값은 명시적인 초기화 없이도 구조체를 즉시 사용할 수 있게 해줍니다. 하지만 슬라이스(slices)나 맵(maps)과 같은 참조 타입은 주의해야 합니다. 이들의 제로 값은 nil이며, 초기화 없이 사용하려고 하면 런타임 패닉(runtime panics)을 발생시킬 수 있습니다.
챌린지
쉬움Go에서 제로 값(zero values)이 어떻게 작동하는지 보여주는 플레이어 프로필 시스템을 만들어 보겠습니다. 일부 필드는 명시적으로 설정하고 다른 필드는 기본 제로 값에 의존하는 게임 프로필을 생성하게 됩니다.
코드는 두 개의 파일로 구성됩니다:
player.go: 다음 필드를 가진Player구조체를 정의합니다:Username(string),Level(int),Score(int),IsPremium(bool), 그리고GuildName(string). 또한 플레이어의 모든 정보를 보여주는 형식화된 문자열을 반환하는DisplayProfile메서드를 만듭니다.main.go: 입력으로부터 사용자 이름을 읽고, 부분 초기화(partial initialization)를 사용하여Username필드만 설정한 Player를 생성합니다. 그런 다음 전체 프로필을 표시하여 Go가 설정되지 않은 필드를 제로 값으로 어떻게 채우는지 확인합니다.
다음과 같은 입력이 제공됩니다:
- Line 1: 플레이어의 사용자 이름
DisplayProfile 메서드는 정확히 다음 형식의 문자열을 반환해야 합니다:
Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]예를 들어, 사용자 이름이 ShadowKnight인 경우, 출력은 사용자 이름과 함께 초기화되지 않은 필드들의 모든 제로 값을 보여주어야 합니다:
Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: Guild 필드의 콜론 뒤에 아무것도 표시되지 않는 것에 주목하세요. 이것이 빈 문자열(empty string)의 제로 값입니다. 이 챌린지는 명시적인 값을 제공하지 않았을 때 Go가 각 타입에 무엇을 할당하는지 정확히 확인하는 데 도움이 됩니다.
치트 시트
Go에서 모든 변수는 제로 값(zero value)을 가집니다. 이는 명시적인 초기화 없이 변수를 선언할 때 할당되는 기본값입니다.
각 타입은 고유한 제로 값을 가집니다:
| 타입 | 제로 값 |
|---|---|
| int, float64 | 0 |
| string | "" (빈 문자열) |
| bool | false |
| pointer, slice, map | nil |
구조체를 생성할 때, 명시적으로 설정하지 않은 모든 필드는 해당 타입의 제로 값을 갖게 됩니다:
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (빈 문자열)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}부분 초기화 — 지정된 필드만 사용자 정의 값을 가집니다:
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false제로 값 덕분에 구조체는 명시적인 초기화 없이도 즉시 사용할 수 있습니다. 슬라이스(slice)나 맵(map)과 같은 참조 타입은 주의해야 합니다. 이들의 제로 값은 nil이며, 초기화 없이 사용하면 런타임 패닉(runtime panic)이 발생할 수 있습니다.
직접 해보기
package main
import (
"fmt"
)
func main() {
// 입력에서 사용자 이름을 읽습니다
var username string
fmt.Scanln(&username)
// TODO: 부분 초기화를 사용하여 Player를 생성합니다
// Username 필드만 설정하고, 다른 필드는 기본값(zero value)을 사용하도록 합니다
// TODO: DisplayProfile 메서드를 사용하여 플레이어의 프로필을 표시합니다
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서