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)을 다룰 때 프로그램이 중단되지 않도록 보장하여, 코드를 더욱 견고하고 신뢰할 수 있게 만듭니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
챌린지
쉬움쓰기 작업을 시도하기 전에 nil 맵을 확인하여 패닉 에러를 방지하는 안전한 맵 초기화 시스템을 만드세요. 이 챌린지는 프로그램을 중단시킬 수 있는 작업을 수행하기 전에 맵 상태를 검증하는 것의 중요성을 보여줍니다.
두 개의 입력을 받게 됩니다:
- 작업의 수를 나타내는 문자열 (예:
"5") - 다음 형식의 작업을 포함하는 문자열:
"operation1:key1:value1,operation2:key2:value2"여기서 작업은"check","init", 또는"add"중 하나입니다 (예:"check:scores,init:scores,add:Alice:95,add:Bob:87,check:grades")
당신의 과제는 다음과 같습니다:
map[string]int타입의scores와grades라는 이름의 두 맵 변수를 초기화하지 않고 생성합니다 (이들은 nil 상태가 됩니다).- 입력 문자열의 각 작업을 순차적으로 처리합니다:
"check"작업의 경우:- 지정된 맵이 nil인지 확인합니다.
- 맵이 nil이면
"Map [map_name] is nil"을 출력합니다. - 맵이 nil이 아니면
"Map [map_name] is initialized"를 출력합니다.
"init"작업의 경우:make(map[string]int)를 사용하여 지정된 맵을 초기화합니다."Initialized map [map_name]"을 출력합니다.
"add"작업의 경우:- 먼저 맵이 nil인지 확인합니다.
- 맵이 nil이면
"Cannot add to nil map [map_name]"을 출력합니다. - 맵이 nil이 아니면 키-값 쌍을 추가하고
"Added [key]:[value] to [map_name]"을 출력합니다.
- 입력 문자열을 분할하여 작업을 파싱합니다:
- 쉼표(,)로 분할하여 개별 작업을 가져옵니다.
- 각 작업에 대해 콜론(:)으로 분할하여 작업 유형과 매개변수를 가져옵니다.
- add 작업의 경우 값 문자열을 정수로 변환합니다.
- 모든 작업을 처리한 후, 두 맵의 최종 상태를 표시합니다:
- 각 맵에 대해, nil인 경우:
"Final state - [map_name]: nil" - 각 맵에 대해, 초기화된 경우:
"Final state - [map_name]: [count] entries"(여기서 count는 키-값 쌍의 수입니다)
- 각 맵에 대해, nil인 경우:
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인지 또는 초기화되었는지 확인하고 그에 따라 출력
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.