Map이란?
Key와 Value를 한 쌍으로 저장하는 컬렉션
- Map은 키를 기준으로 데이터를 저장하고 찾는 구조입니다.
- 하나의 키에 하나의 값을 매핑합니다.
- 키는 중복될 수 없고, 값은 중복될 수 있습니다.
예를 들어,
- 주민등록번호 ➡ 이름
- 상품코드 ➡ 상품명
- 국가코드 ➡ 국가명
와 같이 어떤 값을 고유한 키로 구분해서 저장할 때 사용합니다.
키워드
- Key: 데이터를 찾기 위한 고유한 식별자 (중복 불가)
- Value: 실제 저장하고 싶은 값 (중복 가능)
Map을 써야 하는 상황 예시
| 상황 | 설명 |
| 아이디로 회원정보 찾기 | id ➡ User 객체 저장 |
| 상품 코드로 상품명 조회 | 상품코드 ➡ 상품명 저장 |
| 국가 코드로 국가명 찾기 | KR ➡ 대한민국, US ➡ 미국 |
특징
| 항목 | 설명 |
| 구조 | Key-Value 구조 |
| Key | 고유한 식별자 (중복 불가) |
| Value | 저장하고 싶은 값 (중복 허용) |
| 순서 보장 | 구현체에 따라 다름 |
| 정렬 | 구현체에 따라 다름 |
기본 구조
Map<KeyType, ValueType> map = new HashMap<>();
map.put("KR", "대한민국");
String country = map.get("KR");
예시 코드
import java.util.*;
public class MapBasicExample {
public static void main(String[] args) {
Map<String, String> countries = new HashMap<>();
countries.put("KR", "대한민국");
countries.put("US", "미국");
countries.put("JP", "일본");
System.out.println(countries.get("KR")); // 대한민국
}
}
주요 메서드
| 메서드 | 설명 | 실무 사용 예 |
| put(K key, V value) | key에 value 저장 | 새로운 데이터 저장 |
| get(Object key) | key로 value 조회 | 특정 조건 조회 시 |
| containsKey(Object key) | 해당 key 존재 여부 확인 | 중복 방지, 조건 분기 |
| containsValue(Object value) | 해당 value 존재 여부 확인 | 특정 값 포함 여부 체크 |
| remove(Object key) | key-value 삭제 | 특정 데이터 제거 |
| size() | 항목 수 반환 | 데이터 개수 검증 |
| isEmpty() | 비어 있는지 확인 | 초기화 여부 확인 |
| clear() | 모든 항목 제거 | 초기화 시 사용 |
| keySet() | 모든 key 반환 (Set 형태) | 반복처리 시 자주 사용 |
| values() | 모든 value 반환 (Collection 형태) | 값 통계 등 |
| entrySet() | key-value 묶음 반환 (Set<Map.Entry>) | 전체 반복 처리 시 효율적 |
주의 사항
- Map은 인터페이스이므로 직접 객체 생성 불가 ➡ HashMap, TreeMap, LinkedHashMap 등 구현체 사용 필요
- 키는 null을 허용하지 않는 경우도 있음 (TreeMap)
Map vs List vs Set
| 컬렉션 | 중복 허용 | 순서 보장 | key-value |
| List | O | O | X |
| Set | X | X 또는 O | X |
| Map | key X / value O | key에 따라 다름 | O |
HashMap
HashMap은 Key와 Value를 한 쌍으로 저장하는 가장 많이 쓰이는 Map 구현체입니다.
- Key를 통해 빠르게 Value를 찾을 수 있는 구조입니다.
- 내부적으로는 해시 테이블(Hash Table) 방식을 사용해서, 검색 속도가 매우 빠릅니다.
- 순서를 보장하지 않습니다! → 입력한 순서와 출력 순서는 다를 수 있어요.
기본 구조
Map<String, String> map = new HashMap<>();
map.put("key", "value");
String result = map.get("key");
특징 정리
| 특징 | 설명 |
| 순서 보장 ❌ | 저장 순서와 출력 순서가 다를 수 있음 |
| Key 중복 ❌ | 같은 Key로 put하면 기존 Value가 덮어씌워짐 |
| Value 중복 ⭕ | 값은 중복 가능 |
| 검색 속도 빠름 | 내부적으로 해시 구조 사용 → 평균 O(1) |
| null 허용 | key 1개, value 여러 개 허용 |
Key 중복 예시
Map<String, String> map = new HashMap<>();
map.put("id", "woojin");
map.put("id", "minji"); // 동일한 key → value 덮어쓰기
System.out.println(map.get("id")); // minji
👉 같은 키로 put()하면 이전 값은 덮어쓰기 됩니다.
모든 요소 출력하기
for (String key : map.keySet()) {
System.out.println("key: " + key + ", value: " + map.get(key));
}
👇 혹은 entrySet() 사용도 가능
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " → " + entry.getValue());
}
예시 코드
import java.util.*;
public class HashMapExample {
public static void main(String[] args) {
Map<String, String> capitals = new HashMap<>();
capitals.put("Korea", "Seoul");
capitals.put("USA", "Washington");
capitals.put("Japan", "Tokyo");
System.out.println("USA 수도: " + capitals.get("USA"));
for (String key : capitals.keySet()) {
System.out.println(key + " → " + capitals.get(key));
}
}
}
- 출력 결과 -
USA 수도: Washington
USA → Washington
Japan → Tokyo
Korea → Seoul
주의사항
- 순서가 보장되지 않음
- 멀티스레드 환경에서는 ConcurrentHashMap 권장
언제 HashMap을 쓸까요?
- 빠르게 찾을 때
- 순서 중요하지 않을 때
- 단순한 키-값 매핑
요약정리
- 가장 빠르고 기본적인 Map
- 순서 필요 없을 때 최적
- 해시 충돌 고려 안 하면 검색 성능 저하 가능
LinkedHashMap
LinkedHashMap은 HashMap의 기능 + 입력 순서 유지라는 특징을 가진 Map입니다.
👉 입력한 순서대로 데이터를 순회하고 싶다면? → HashMap 대신 LinkedHashMap을 사용하면 됩니다!
기본 구조
Map<String, String> map = new LinkedHashMap<>();
map.put("one", "1");
map.put("two", "2");
특징 정리
| 항목 | 설명 |
| 순서 보장 ⭕ | ✅ 입력한 순서 유지 |
| 정렬 ❌ | ❌ 없음 |
| 검색 속도 | HashMap과 비슷 |
| 메모리 | 순서 유지를 위해 약간 더 사용 |
예시 코드
import java.util.*;
public class LinkedHashMapExample {
public static void main(String[] args) {
Map<String, String> map = new LinkedHashMap<>();
map.put("one", "하나");
map.put("two", "둘");
map.put("three", "셋");
for (String key : map.keySet()) {
System.out.println(key + " → " + map.get(key));
}
}
}
- 출력 결과 -
one → 하나
two → 둘
three → 셋
👉 입력한 순서 그대로 출력됩니다!
HashMap vs LinkedHashMap
| 항목 | HashMap | LinkedHashMap |
| 순서 보장 | ❌ 없음 | ✅ 입력 순서 유지 |
| 성능 | 더 빠름 | 약간 느림 (순서 저장용 연결 리스트 때문) |
| 메모리 | 적게 사용 | 약간 더 사용함 |
| 용도 | 순서 상관없을 때 | 순서 중요할 때 (예: 최근 사용 순 등) |
주의사항
- 성능은 HashMap보다 약간 느림
- 메모리 사용량 조금 증가
언제 LinkedHashMap을 쓸까요?
- 순서 보존이 중요한 설정 정보
- 최근 요청 순 저장
- 간단한 LRU 캐시
요약정리
- 입력 순서 유지하는 Map
- 순서대로 반복 출력 가능
- 설정 저장, 요청 순 추적 등에 적합
TreeMap
TreeMap은 Key를 자동으로 정렬해서 저장하는 Map 구현체입니다.
- Map 중에서 유일하게 정렬된 Key 순서로 데이터를 저장/출력합니다.
- 내부적으로 이진 탐색 트리 (Red-Black Tree) 를 사용합니다.
- Key에 대해 Comparable 또는 Comparator가 필요합니다.
👉 정렬이 필요할 때 사용됩니다!
기본 구조
Map<String, String> map = new TreeMap<>();
map.put("apple", "사과");
map.put("banana", "바나나");
특징 정리
| 항목 | 설명 |
| 순서 보장 ⭕ | ✅ 정렬된 순서 |
| 정렬 ⭕ | ✅ Key 기준 오름차순 (기본 ➡ 변경 가능) |
| 검색 속도 | O(logN) (HashMap보다 느림) |
| null key | ❌ 허용 안됨 |
예시 코드
import java.util.*;
public class TreeMapSimpleExample {
public static void main(String[] args) {
// 1. 기본 TreeMap (오름차순 정렬)
TreeMap<Integer, String> map = new TreeMap<>();
map.put(30, "삼십");
map.put(10, "열");
map.put(20, "이십");
System.out.println("기본 정렬 (오름차순):");
for (Integer key : map.keySet()) {
System.out.println(key + " → " + map.get(key));
}
// 2. 정렬 커스터마이징 (내림차순 정렬)
TreeMap<Integer, String> reversedMap = new TreeMap<>(Comparator.reverseOrder());
reversedMap.putAll(map);
System.out.println("\n커스텀 정렬 (내림차순):");
for (Integer key : reversedMap.keySet()) {
System.out.println(key + " → " + reversedMap.get(key));
}
// 3. 범위 조회
System.out.println("\n범위 조회:");
System.out.println("headMap(20): " + map.headMap(20)); // 20보다 작은 key
System.out.println("tailMap(20): " + map.tailMap(20)); // 20 이상인 key
System.out.println("subMap(10, 30): " + map.subMap(10, 30)); // 10 이상 30 미만
}
}
- 출력 결과 -
기본 정렬 (오름차순):
10 → 열
20 → 이십
30 → 삼십
커스텀 정렬 (내림차순):
30 → 삼십
20 → 이십
10 → 열
범위 조회:
headMap(20): {10=열}
tailMap(20): {20=이십, 30=삼십}
subMap(10, 30): {10=열, 20=이십}
TreeMap vs HashMap vs LinkedHashMap
| 항목 | TreeMap | HashMap | LinkedHashMap |
| 정렬 여부 | ❌ 없음 | ❌ 없음 (입력 순서 유지) | ✅ key 기준 정렬 |
| 순서 유지 | ❌ 없음 | ✅ 입력 순서 | ✅ 정렬 순서 |
| 검색 속도 | ✅ 빠름 (O(1)) | ✅ 빠름 (O(1)) | ❗ 느림 (O(logN)) |
| null key | ✅ 1개 허용 | ✅ 1개 허용 | ❌ 허용 안 함 |
주의사항
- 키에 null 사용 불가
- 성능은 HashMap보다 느림
언제 TreeMap을 쓸까요?
- 데이터를 항상 정렬된 상태로 유지하고 싶을 때
- 순위, 사전식 정렬, 날짜/시간 정렬 등이 필요한 경우
- 범위 조회(subMap, headMap, tailMap)를 사용하고 싶을 때
요약정리
- 자동 정렬 Map
- 오름차순 기본, 내림차순도 가능
- 정렬된 데이터가 필요할 때 적합
요약정리
| 구현체 | 특징 | 순서 | 정렬 | 성능 |
| HashMap | 가장 빠름, 순서 없음 | ❌ | ❌ | O(1) |
| LinkedHashMap | 입력 순서 유지 | ✅ | ❌ | O(1) |
| TreeMap | 자동 정렬 ➡ 정렬 필요 시 사용 | ✅ | ✅ | O(logN) |
읽어주셔서 감사합니다 😊
'프로그래밍 언어 > Java' 카테고리의 다른 글
| [Java] 41. Arrays 클래스 vs Collections 클래스 (1) | 2025.05.08 |
|---|---|
| [Java] 40. 반복자 Iterator란? (Iterator, ListIterator, Enumeration) (0) | 2025.05.08 |
| [Java] 38. Set이란? (HashSet, LinkedHashSet, TreeSet) (0) | 2025.04.30 |
| [Java] 37. List란? (ArrayList, LinkedList, Vector) (0) | 2025.04.22 |
| [Java] 36. 컬렉션 프레임워크란? (0) | 2025.04.22 |
