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 // 이제 이것은 안전합니다이 간단한 검사는 초기화되지 않았을 가능성이 있는 맵을 사용할 때 프로그램이 중단되지 않도록 하여, 코드를 더욱 견고하고 안정적으로 만들어 줍니다.
챌린지
쉬움쓰기 작업을 시도하기 전에 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"
다음 작업을 수행하세요:
map[string]int타입의 map 변수 두 개를scores및grades라는 이름으로 생성하되 initialization하지 마세요(두 변수는 nil 상태가 됩니다).- 입력 문자열의 각 operation을 sequentially 처리하세요:
"check"operations의 경우:- 지정된 map이 nil인지 확인합니다.
- map이 nil이면
"Map [map_name] is nil"을 출력합니다. - map이 nil이 아니면
"Map [map_name] is initialized"를 출력합니다.
"init"operations의 경우:make(map[string]int)을 사용하여 지정된 map을 initialization합니다."Initialized map [map_name]"을 출력합니다.
"add"operations의 경우:- 먼저 map이 nil인지 확인합니다.
- map이 nil이면
"Cannot add to nil map [map_name]"을 출력합니다. - map이 nil이 아니면 key-value 쌍을 추가하고
"Added [key]:[value] to [map_name]"을 출력합니다.
- 입력 문자열을 분할하여 operations을 구문 분석합니다:
- 쉼표로 분할하여 개별 operations을 가져옵니다.
- 각 operation을 콜론으로 분할하여 operation type과 매개변수를 가져옵니다.
- add operations의 경우 value 문자열을 integer로 convert합니다.
- 모든 operations을 처리한 후 두 map의 최종 상태를 표시합니다:
- 각 map에 대해 nil이면
"Final state - [map_name]: nil"을 출력합니다. - 각 map에 대해 initialized 상태이면
"Final state - [map_name]: [count] entries"를 출력합니다. 여기서 count는 key-value 쌍의 개수입니다. - operations에서 사용된 순서와 관계없이
scores를 먼저,grades를 두 번째로 출력합니다.
- 각 map에 대해 nil이면
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인지 또는 초기화되었는지 확인하고 그에 따라 출력
}이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 & 흐름의 모든 레슨
직접 연습해 보세요: 온라인 Go 컴파일러