Menu
Coddy logo textTech

제로 값과 기본값

Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 17번째.

Go에서 모든 변수에는 zero value가 있습니다. 이는 변수를 명시적으로 초기화하지 않고 선언할 때 할당되는 기본값입니다. 구조체를 다룰 때 zero value를 이해하는 것은 필수적입니다. 초기화되지 않은 fields에는 이러한 기본값이 자동으로 할당되기 때문입니다.

각 type에는 고유한 zero value가 있습니다:

TypeZero Value
int, float640
string"" (빈 문자열)
boolfalse
pointer, slice, mapnil

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 없이 사용하려고 하면 런타임 패닉이 발생할 수 있습니다.

challenge icon

챌린지

쉬움

Go에서 zero values가 어떻게 작동하는지 보여 주는 player profile system을 만들어 보겠습니다. 일부 fields는 명시적으로 설정하고 나머지는 기본 zero values에 의존하는 game profile을 만들게 됩니다.

코드는 두 파일에 걸쳐 구성합니다.

  • player.go: 다음 fields를 포함하는 Player struct를 Define합니다: Username (string), Level (int), Score (int), IsPremium (bool), GuildName (string). 또한 player의 모든 정보를 보여 주는 formatted string을 returns하는 DisplayProfile method를 Create합니다.
  • main.go: input에서 username을 Read하고 partial initialization만 사용하여 Player를 Create합니다. Username field만 설정합니다. 그런 다음 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 메서드를 사용하여 플레이어의 프로필 표시
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Go 컴파일러