제로 값과 기본값
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 17번째.
Go에서 모든 변수에는 zero value가 있습니다. 이는 변수를 명시적으로 초기화하지 않고 선언할 때 할당되는 기본값입니다. 구조체를 다룰 때 zero value를 이해하는 것은 필수적입니다. 초기화되지 않은 fields에는 이러한 기본값이 자동으로 할당되기 때문입니다.
각 type에는 고유한 zero value가 있습니다:
| Type | Zero Value |
|---|---|
| int, float64 | 0 |
| string | "" (빈 문자열) |
| bool | false |
| pointer, slice, map | nil |
struct을 생성하면 명시적으로 설정하지 않은 모든 field는 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
}이는 partial initialization에도 적용됩니다. Only 지정한 fields에만 사용자 지정 값이 할당됩니다.
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
제로 값은 명시적인 initialization 없이도 struct를 즉시 사용할 수 있게 합니다. 하지만 슬라이스와 map 같은 참조 타입을 사용할 때는 주의해야 합니다. 이러한 타입의 제로 값은 nil이며, initialization 없이 사용하려고 하면 런타임 패닉이 발생할 수 있습니다.
챌린지
쉬움Go에서 zero values가 어떻게 작동하는지 보여 주는 player profile system을 만들어 보겠습니다. 일부 fields는 명시적으로 설정하고 나머지는 기본 zero values에 의존하는 game profile을 만들게 됩니다.
코드는 두 파일에 걸쳐 구성합니다.
player.go: 다음 fields를 포함하는Playerstruct를 Define합니다:Username(string),Level(int),Score(int),IsPremium(bool),GuildName(string). 또한 player의 모든 정보를 보여 주는 formatted string을 returns하는DisplayProfilemethod를 Create합니다.main.go: input에서 username을 Read하고 partial initialization만 사용하여 Player를 Create합니다.Usernamefield만 설정합니다. 그런 다음 complete profile을 Display하여 설정되지 않은 fields를 Go가 zero values로 어떻게 채우는지 확인합니다.
다음 input이 제공됩니다.
- Line 1: player의 username
DisplayProfile method는 다음 exact format의 string을 returns해야 합니다.
Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]예를 들어 username이 ShadowKnight인 경우, output에는 username과 initialization되지 않은 fields의 모든 zero values가 표시되어야 합니다.
Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: Guild field의 콜론 뒤에는 아무것도 표시되지 않는다는 점에 주목하세요. 이것이 empty string zero value입니다. 이 challenge를 통해 명시적인 값을 제공하지 않았을 때 Go가 각 type에 정확히 무엇을 할당하는지 확인할 수 있습니다.
직접 해보기
package main
import (
"fmt"
)
func main() {
// 입력에서 사용자 이름 읽기
var username string
fmt.Scanln(&username)
// TODO: 부분 초기화를 사용하여 Player 생성
// Username 필드만 설정하고, 다른 필드는 제로 값을 사용하도록 함
// TODO: DisplayProfile 메서드를 사용하여 플레이어의 프로필 표시
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러