Map

키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 자료구조입니다. 키로 값을 빠르게 조회할 수 있습니다.

특징

항목설명
키 중복허용 안 함
값 중복허용
순서구현체에 따라 다름
조회키로 O(1) 접근

Java에서의 Map

// 인터페이스
Map<String, Integer> map;

// 주요 구현체
Map<String, Integer> hashMap = new HashMap<>();
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
Map<String, Integer> treeMap = new TreeMap<>();

구현체별 차이

구현체순서정렬성능
HashMap없음없음O(1) 가장 빠름
LinkedHashMap삽입 순서 유지없음O(1)
TreeMap키 기준 정렬자동 정렬O(log n)

기본 사용법

Map<String, Integer> scores = new HashMap<>();

// 추가
scores.put("홍길동", 90);
scores.put("김철수", 85);
scores.put("홍길동", 95);  // 키 중복 → 값 덮어씀

// 조회
scores.get("홍길동");       // 95
scores.getOrDefault("박영희", 0);  // 없으면 0 반환

// 포함 여부
scores.containsKey("홍길동");   // true
scores.containsValue(90);       // false

// 삭제
scores.remove("홍길동");

// 크기
scores.size();

순회

Map<String, Integer> map = new HashMap<>();

// 키 순회
for (String key : map.keySet()) {
    System.out.println(key);
}

// 값 순회
for (Integer value : map.values()) {
    System.out.println(value);
}

// 키-값 쌍 순회
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println(entry.getKey() + ": " + entry.getValue());
}

// forEach
map.forEach((key, value) -> {
    System.out.println(key + ": " + value);
});

유용한 메서드

// 없을 때만 추가
map.putIfAbsent("홍길동", 100);

// 값 계산해서 추가
map.computeIfAbsent("홍길동", k -> calculateScore(k));

// 값 변환
map.compute("홍길동", (k, v) -> v == null ? 0 : v + 10);

// 병합
map.merge("홍길동", 10, Integer::sum);  // 기존 값 + 10

List, Set, Map 비교

자료구조저장 방식중복순서용도
List값OO순서 있는 목록
Set값XX고유 값 집합
Map키-값 쌍키 XX키로 값 조회

언제 사용하나?

// 빠른 조회가 필요할 때
Map<Long, User> userCache = new HashMap<>();
User user = userCache.get(userId);

// 그룹핑
Map<String, List<User>> usersByCity = new HashMap<>();

// 카운팅
Map<String, Integer> wordCount = new HashMap<>();
wordCount.merge(word, 1, Integer::sum);

// 설정값 관리
Map<String, String> config = new HashMap<>();

CSLOG에서 보기