Menu
Coddy logo textTech

Nil Map 체크하기

Coddy GO 여정의 로직 & 흐름 섹션에 포함된 레슨. 68개 중 28번째.

Go에서 map은 nil이라는 특별한 상태를 가질 수 있습니다. nil map은 본질적으로 메모리에서 아무것도 가리키지 않는 초기화되지 않은 map입니다. 이 개념을 이해하는 것은 매우 중요합니다. nil map에 키를 추가하려고 하면 프로그램에서 panic이 발생하고 충돌하기 때문입니다.

nil 맵이 어떻게 발생하고 어떤 모습인지 살펴보겠습니다:

var myMap map[string]int
// myMap은 이 시점에서 nil입니다

map 변수를 초기화하지 않고 선언하면 Go는 자동으로 nil로 설정합니다. nil map에서 안전하게 읽을 수 있지만(제로 값을 반환합니다), 여기에 쓰려고 하면 panic이 발생합니다:

// 이것은 안전합니다 - 0을 반환합니다
value := myMap["key"]

// 이것은 패닉이 발생합니다!
myMap["key"] = 42

이 문제를 피하려면 map에 키를 add하기 전에 map이 nil인지 항상 check해야 합니다. check는 간단합니다:

if myMap == nil {
    myMap = make(map[string]int)
}
myMap["key"] = 42 // 이제 이것은 안전합니다

이 간단한 검사는 초기화되지 않았을 가능성이 있는 맵을 사용할 때 프로그램이 중단되지 않도록 하여, 코드를 더욱 견고하고 안정적으로 만들어 줍니다.

challenge icon

챌린지

쉬움

쓰기 작업을 시도하기 전에 nil map을 확인하여 panic 오류를 방지하는 안전한 map initialization 시스템을 만드세요. 이 과제에서는 프로그램을 충돌시킬 수 있는 operations을 수행하기 전에 map 상태를 검증하는 것이 얼마나 중요한지 보여 줍니다.

두 개의 입력을 받습니다:

  • operations의 개수를 나타내는 문자열(예: "5")
  • 쉼표로 구분된 operations이 포함된 문자열. 각 operation은 자신이 작업하는 map의 이름을 포함합니다:
    • "check:[map_name]"
    • "init:[map_name]"
    • "add:[map_name]:[key]:[value]"
    예: "check:scores,init:scores,add:scores:Alice:95,add:scores:Bob:87,check:grades"

다음 작업을 수행하세요:

  1. map[string]int 타입의 map 변수 두 개를 scoresgrades라는 이름으로 생성하되 initialization하지 마세요(두 변수는 nil 상태가 됩니다).
  2. 입력 문자열의 각 operation을 sequentially 처리하세요:
  3. "check" operations의 경우:
    • 지정된 map이 nil인지 확인합니다.
    • map이 nil이면 "Map [map_name] is nil"을 출력합니다.
    • map이 nil이 아니면 "Map [map_name] is initialized"를 출력합니다.
  4. "init" operations의 경우:
    • make(map[string]int)을 사용하여 지정된 map을 initialization합니다.
    • "Initialized map [map_name]"을 출력합니다.
  5. "add" operations의 경우:
    • 먼저 map이 nil인지 확인합니다.
    • map이 nil이면 "Cannot add to nil map [map_name]"을 출력합니다.
    • map이 nil이 아니면 key-value 쌍을 추가하고 "Added [key]:[value] to [map_name]"을 출력합니다.
  6. 입력 문자열을 분할하여 operations을 구문 분석합니다:
    • 쉼표로 분할하여 개별 operations을 가져옵니다.
    • 각 operation을 콜론으로 분할하여 operation type과 매개변수를 가져옵니다.
    • add operations의 경우 value 문자열을 integer로 convert합니다.
  7. 모든 operations을 처리한 후 두 map의 최종 상태를 표시합니다:
    • 각 map에 대해 nil이면 "Final state - [map_name]: nil"을 출력합니다.
    • 각 map에 대해 initialized 상태이면 "Final state - [map_name]: [count] entries"를 출력합니다. 여기서 count는 key-value 쌍의 개수입니다.
    • operations에서 사용된 순서와 관계없이 scores를 먼저, grades를 두 번째로 출력합니다.

strconv package를 사용하여 add operations의 value 문자열을 integer로 convert하세요. 이 과제에서는 쓰기 operations 전에 nil map을 확인하면 runtime panic을 방지하고 코드를 견고하고 안정적으로 만들 수 있음을 보여 줍니다.

직접 해보기

package main

import (
	"fmt"
	"strconv"
	"strings"
)

func main() {
	// 입력 읽기
	var numOpsStr string
	var operationsStr string
	fmt.Scanln(&numOpsStr)
	fmt.Scanln(&operationsStr)
	
	// 초기화 없이 맵 선언 (nil이 됨)
	var scores map[string]int
	var grades map[string]int
	
	// 쉼표로 연산 분할
	operations := strings.Split(operationsStr, ",")
	
	// TODO: 아래에 코드를 작성하세요
	// 각 연산을 순차적으로 처리
	// "check", "init", "add" 연산 처리
	// add 연산의 경우, strconv.Atoi()를 사용하여 값 문자열을 정수로 변환
	
	// 두 맵의 최종 상태 출력
	// 맵이 nil인지 또는 초기화되었는지 확인하고 그에 따라 출력
}
quiz icon실력 점검

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

로직 & 흐름의 모든 레슨

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