📋 Map의 기본 개념
🎯 Map이란?
- 키-값 쌍을 저장하는 자료 구조
- 키는 유일해야 하며, 값은 중복 가능
- 키를 통해 값을 빠르게 검색 가능
- 순서를 유지하지 않음 (HashMap 기준)
🔧 Map 인터페이스 주요 메서드
데이터 저장/수정
메서드 설명
| put(K key, V value) |
키-값을 맵에 저장 (같은 키가 있으면 값 변경) |
| putAll(Map<?, ?> m) |
지정된 맵의 모든 매핑을 현재 맵에 복사 |
| putIfAbsent(K key, V value) |
키가 없는 경우에만 저장 |
데이터 조회
메서드 설명
| get(Object key) |
키에 연결된 값 반환 |
| getOrDefault(Object key, V defaultValue) |
키가 없으면 기본값 반환 |
| containsKey(Object key) |
키 존재 여부 확인 |
| containsValue(Object value) |
값 존재 여부 확인 |
데이터 삭제/확인
메서드 설명
| remove(Object key) |
키와 연결된 값 제거 |
| clear() |
모든 키-값 제거 |
| size() |
키-값 쌍의 개수 반환 |
| isEmpty() |
맵이 비어있는지 확인 |
컬렉션 반환
메서드 반환 타입 설명
| keySet() |
Set<K> |
모든 키를 Set으로 반환 |
| values() |
Collection<V> |
모든 값을 Collection으로 반환 |
| entrySet() |
Set<Map.Entry<K,V>> |
키-값 쌍을 Entry Set으로 반환 |
💡 핵심 개념 이해
Entry (키-값 쌍)
// Entry는 키와 값을 하나로 묶는 객체
Set<Map.Entry<String, Integer>> entries = map.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();
Integer value = entry.getValue();
}
같은 키로 저장 시 동작
- 기존 값이 교체됨
- studentA=90 → studentA=100으로 변경
조건부 저장
// 방법 1: 직접 확인
if (!map.containsKey("key")) {
map.put("key", value);
}
// 방법 2: putIfAbsent 사용 (권장)
map.putIfAbsent("key", value);
🗂️ Map 구현체 비교
Map vs Set의 관계
- Map의 키 = Set과 동일한 구조
- Map은 Key 옆에 Value가 추가된 형태
- 구현체도 거의 동일: HashSet ↔ HashMap
주요 구현체 특징
1. HashMap
- 구조: 해시 테이블 사용
- 성능: 삽입/삭제/검색 모두 O(1)
- 순서: 순서 보장 안 함
- 용도: 가장 많이 사용되는 Map
2. LinkedHashMap
- 구조: HashMap + 연결 리스트
- 성능: HashMap과 유사한 O(1)
- 순서: 입력 순서 보장
- 용도: 순서가 중요한 경우
3. TreeMap
- 구조: 레드-블랙 트리 기반
- 성능: O(log n)
- 순서: 키 기준 정렬
- 용도: 정렬이 필요한 경우
실행 결과 비교
// 입력: C=10, B=20, A=30, 1=40, 2=50
HashMap: A=30 1=40 B=20 2=50 C=10 // 순서 무작위
LinkedHashMap: C=10 B=20 A=30 1=40 2=50 // 입력 순서
TreeMap: 1=40 2=50 A=30 B=20 C=10 // 키 기준 정렬
⚠️ 주의사항
Map Key 객체의 필수 조건
- hashCode()와 equals() 메서드를 반드시 구현해야 함
- 이는 해시 테이블의 정확한 동작을 위해 필수
실무 권장사항
- 일반적인 용도: HashMap 사용
- 순서 유지 필요: LinkedHashMap 사용
- 정렬 필요: TreeMap 사용