Menu
Coddy logo textTech

Nil Map 체크하기

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

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

nil 맵이 발생하는 방식과 그 모습은 다음과 같습니다:

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

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

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

// 이 작업은 패닉을 발생시킵니다!
myMap["key"] = 42

이 문제를 피하려면, 맵에 키를 추가하기 전에 항상 맵이 nil인지 확인해야 합니다. 확인 방법은 간단합니다:

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

이 간단한 확인은 초기화되지 않았을 가능성이 있는 맵(maps)을 다룰 때 프로그램이 중단되지 않도록 보장하여, 코드를 더욱 견고하고 신뢰할 수 있게 만듭니다.

quiz icon실력 점검

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

quiz icon실력 점검

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

quiz icon실력 점검

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

challenge icon

챌린지

쉬움

쓰기 작업을 시도하기 전에 nil 맵을 확인하여 패닉 에러를 방지하는 안전한 맵 초기화 시스템을 만드세요. 이 챌린지는 프로그램을 중단시킬 수 있는 작업을 수행하기 전에 맵 상태를 검증하는 것의 중요성을 보여줍니다.

두 개의 입력을 받게 됩니다:

  • 작업의 수를 나타내는 문자열 (예: "5")
  • 다음 형식의 작업을 포함하는 문자열: "operation1:key1:value1,operation2:key2:value2" 여기서 작업은 "check", "init", 또는 "add" 중 하나입니다 (예: "check:scores,init:scores,add:Alice:95,add:Bob:87,check:grades")

당신의 과제는 다음과 같습니다:

  1. map[string]int 타입의 scoresgrades라는 이름의 두 맵 변수를 초기화하지 않고 생성합니다 (이들은 nil 상태가 됩니다).
  2. 입력 문자열의 각 작업을 순차적으로 처리합니다:
  3. "check" 작업의 경우:
    • 지정된 맵이 nil인지 확인합니다.
    • 맵이 nil이면 "Map [map_name] is nil"을 출력합니다.
    • 맵이 nil이 아니면 "Map [map_name] is initialized"를 출력합니다.
  4. "init" 작업의 경우:
    • make(map[string]int)를 사용하여 지정된 맵을 초기화합니다.
    • "Initialized map [map_name]"을 출력합니다.
  5. "add" 작업의 경우:
    • 먼저 맵이 nil인지 확인합니다.
    • 맵이 nil이면 "Cannot add to nil map [map_name]"을 출력합니다.
    • 맵이 nil이 아니면 키-값 쌍을 추가하고 "Added [key]:[value] to [map_name]"을 출력합니다.
  6. 입력 문자열을 분할하여 작업을 파싱합니다:
    • 쉼표(,)로 분할하여 개별 작업을 가져옵니다.
    • 각 작업에 대해 콜론(:)으로 분할하여 작업 유형과 매개변수를 가져옵니다.
    • add 작업의 경우 값 문자열을 정수로 변환합니다.
  7. 모든 작업을 처리한 후, 두 맵의 최종 상태를 표시합니다:
    • 각 맵에 대해, nil인 경우: "Final state - [map_name]: nil"
    • 각 맵에 대해, 초기화된 경우: "Final state - [map_name]: [count] entries" (여기서 count는 키-값 쌍의 수입니다)

add 작업을 위해 값 문자열을 정수로 변환할 때는 strconv 패키지를 사용하세요. 이 챌린지는 쓰기 작업 전에 nil 맵을 확인하는 것이 어떻게 런타임 패닉을 방지하고 코드를 견고하고 신뢰할 수 있게 만드는지 보여줍니다.

치트 시트

nil 맵은 메모리에서 아무것도 가리키지 않는 초기화되지 않은 맵입니다. nil 맵에 키를 추가하려고 시도하면 프로그램이 패닉(panic) 상태가 되어 종료됩니다.

초기화하지 않고 맵을 선언하면 nil 맵이 생성됩니다:

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

nil 맵에서 읽는 것은 안전하지만(제로 값을 반환), 여기에 쓰는 것은 패닉을 발생시킵니다:

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

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

키를 추가하기 전에 항상 맵이 nil인지 확인하세요:

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

직접 해보기

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실력 점검

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

로직 & 흐름의 모든 레슨