
지금까지 본 List와 Set은 값 하나씩을 담는다. 그런데 "이름 → 전화번호", "학번 → 이름"처럼 쌍으로 묶인 데이터를 다뤄야 할 때가 있다. 이를 위한 컬렉션이 Map이다.
Map은 키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 컬렉션이다. 사전처럼, 단어(Key)를 찾으면 뜻(Value)이 나오는 구조다.

import java.util.HashMap;
import java.util.Map;
Map<String, String> phoneBook = new HashMap<>();
phoneBook.put("김민수", "010-1234-5678");
phoneBook.put("이지은", "010-9876-5432");
phoneBook.put("박준호", "010-1111-2222");
System.out.println(phoneBook.get("김민수")); // 010-1234-5678
키는 중복될 수 없다. 같은 키로 값을 두 번 넣으면 나중 값이 덮어쓴다.
Map<String, Integer> map = new HashMap<>();
map.put("사과", 1000);
map.put("사과", 2000); // 덮어쓰기
System.out.println(map.get("사과")); // 2000
값은 중복될 수 있다. 다른 키가 같은 값을 가져도 된다.
순서를 보장하지 않는다. (HashMap 기준)
가장 일반적으로 쓰이는 Map이다. 내부적으로 해시 테이블을 사용해서 검색/추가/삭제가 빠르다. 순서는 보장하지 않는다.
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("바나나", 500);
hashMap.put("사과", 1000);
hashMap.put("딸기", 800);
System.out.println(hashMap); // 순서 보장 없음
입력한 순서를 유지하는 Map이다.
import java.util.LinkedHashMap;
Map<String, Integer> linkedMap = new LinkedHashMap<>();
linkedMap.put("바나나", 500);
linkedMap.put("사과", 1000);
linkedMap.put("딸기", 800);
System.out.println(linkedMap); // {바나나=500, 사과=1000, 딸기=800} (입력 순서 유지)
키를 정렬된 순서로 유지하는 Map이다. 키가 문자열이면 사전 순, 숫자면 오름차순으로 자동 정렬된다.
import java.util.TreeMap;
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("바나나", 500);
treeMap.put("사과", 1000);
treeMap.put("딸기", 800);
System.out.println(treeMap); // {바나나=500, 딸기=800, 사과=1000} (키 기준 정렬)

Map<String, Integer> map = new HashMap<>();
// 추가 / 수정
map.put("사과", 1000);
// 조회
map.get("사과"); // 1000 (없으면 null)
map.getOrDefault("포도", 0); // 키가 없으면 기본값 반환
// 삭제
map.remove("사과");
// 확인
map.containsKey("바나나"); // 키 존재 여부
map.containsValue(1000); // 값 존재 여부
map.size(); // 크기
map.isEmpty(); // 비어있는지
// 전체 조회
map.keySet(); // 키 목록 (Set)
map.values(); // 값 목록 (Collection)
map.entrySet(); // 키-값 쌍 목록
Map은 인덱스가 없으므로 keySet() 또는 entrySet()으로 순회한다.
Map<String, Integer> map = new HashMap<>();
map.put("사과", 1000);
map.put("바나나", 500);
map.put("딸기", 800);
// 키로 순회
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
// 키-값 쌍으로 순회 (더 효율적)
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
지금까지 배운 컬렉션 프레임워크를 한눈에 정리하면 이렇다.
| 컬렉션 | 특징 | 대표 구현체 |
|---|---|---|
| List | 순서 유지, 중복 허용, 인덱스 접근 | ArrayList, LinkedList |
| Set | 중복 불허, 순서 미보장 | HashSet, TreeSet |
| Map | 키-값 쌍, 키 중복 불허 | HashMap, TreeMap |
어떤 컬렉션을 써야 할지 막막할 때는 세 가지만 따져보면 된다.
중복을 허용해야 하는가? → List
중복 없이 값만 모아야 하는가? → Set
키로 값을 찾아야 하는가? → Map