학습
Go 맵 (Maps)
Go 맵 (Maps) — 초급
맵 (Maps)
1. 도입 (왜 배워야 하는가)
Go 언어에서 맵(Map)은 키-값 쌍으로 데이터를 저장하는 자료구조입니다. 이는 데이터베이스의 테이블처럼 각 데이터 항목에 고유한 식별자를 부여하여 효율적으로 접근할 수 있게 해줍니다. 실무에서는 설정 정보, 사용자 세션, 캐시 데이터 등을 관리할 때 맵을 많이 사용합니다. 만약 맵을 사용하지 않는다면, 데이터를 배열이나 슬라이스에 저장하게 되며, 이 경우 효율적인 검색이나 수정이 어려워질 수 있습니다. 예를 들어, 수천 개의 사용자 데이터를 관리할 때, 각 사용자를 이름으로 검색하려면 배열을 사용하면 O(n)의 시간이 걸리지만, 맵을 사용하면 O(1)의 시간 복잡도로 빠르게 검색할 수 있습니다.
2. 핵심 개념 설명
맵은 다음과 같은 핵심 개념으로 구성됩니다:
- 키 (Key): 데이터를 식별하는 고유한 값입니다.
- 값 (Value): 키에 대응하는 데이터입니다.
실생활 비유로 설명하자면, 맵은 전화번호부와 같습니다. 전화번호부에서 이름(키)을 통해 해당 사람의 전화번호(값)를 쉽게 찾을 수 있는 것처럼, 맵에서도 키를 통해 값을 쉽게 찾을 수 있습니다.
| 용어 | 설명 |
|---|---|
| 키 | 데이터의 고유 식별자 |
| 값 | 키에 매핑되는 데이터 |
| 맵 | 키-값 쌍으로 데이터를 저장하는 구조 |
3. 기본 코드 예제
아래는 Go 언어에서 맵을 사용하는 기본적인 예제입니다.
package main
import "fmt"
func main() {
// 맵 초기화
phoneBook := make(map[string]string)
// 데이터 추가
phoneBook["Alice"] = "123-456-7890"
phoneBook["Bob"] = "987-654-3210"
// 데이터 조회
fmt.Println("Alice의 전화번호:", phoneBook["Alice"])
fmt.Println("Bob의 전화번호:", phoneBook["Bob"])
}
실행 결과
Alice의 전화번호: 123-456-7890
Bob의 전화번호: 987-654-3210
코드 한 줄씩 동작 설명
package main- 메인 패키지를 정의합니다.import "fmt"- 포맷 입출력 패키지를 가져옵니다.phoneBook := make(map[string]string)- 키는 문자열, 값도 문자열인 빈 맵을 초기화합니다.phoneBook["Alice"] = "123-456-7890"- "Alice"라는 키에 전화번호를 추가합니다.phoneBook["Bob"] = "987-654-3210"- "Bob"이라는 키에 전화번호를 추가합니다.fmt.Println(...)- 키에 해당하는 값을 출력합니다.- 올바른 접근: 키가 존재하지 않을 경우 기본값을 반환하므로, 조회 전에 키의 존재 여부를 확인해야 합니다.
- 올바른 접근:
make함수를 사용하여 맵을 초기화한 후 사용해야 합니다. - 맵은 키-값 쌍으로 데이터를 저장하는 자료구조입니다.
- 효율적으로 데이터를 검색, 수정, 삭제할 수 있습니다.
- 실생활 비유로 전화번호부와 유사합니다.
- 초기화 시
make함수를 반드시 사용해야 합니다. - 키가 존재하지 않는 경우에는 기본값이 반환됩니다.
- 슬라이스(Slices)
- 구조체(Structs)
- 인터페이스(Interfaces)
4. 실전 활용 예제
예제 1: 쇼핑몰 장바구니 구현
쇼핑몰에서 장바구니를 구현할 때, 사용자가 선택한 상품과 수량을 맵으로 관리합니다.
package main
import "fmt"
func main() {
cart := make(map[string]int)
// 상품 추가
cart["사과"] = 3
cart["바나나"] = 2
// 장바구니 출력
for item, quantity := range cart {
fmt.Printf("%s: %d개\n", item, quantity)
}
}
예제 2: 학생 성적 관리
학생의 이름과 성적을 관리하는 경우에도 맵을 사용할 수 있습니다.
package main
import "fmt"
func main() {
grades := make(map[string]float64)
// 성적 추가
grades["홍길동"] = 85.5
grades["이순신"] = 90.0
// 성적 출력
fmt.Println("홍길동의 성적:", grades["홍길동"])
}
5. 흔한 실수와 주의사항
실수 1: 키가 없는 경우
fmt.Println(phoneBook["Charlie"]) // 존재하지 않는 키 "Charlie" 조회
실수 2: 맵의 초기화
var phoneBook map[string]string // 초기화하지 않음
phoneBook["Alice"] = "123-456-7890" // 런타임 에러 발생