Table of Contents
자바 컬렉션 프레임워크 - Map 인터페이스
1. Map 인터페이스란?
Map
인터페이스는 키(Key)와 값(Value)의 쌍으로 데이터를 저장하는 자료구조입니다.
각 키는 고유(unique) 하며, 하나의 키에 하나의 값만 매핑될 수 있습니다.
2. 주요 특징
- 키(Key) 중복 불가: 동일한 키를 사용하여 값을 저장하면 기존 값이 덮어쓰기됩니다.
- 값(Value) 중복 가능: 서로 다른 키에 동일한 값을 저장할 수 있습니다.
- 빠른 검색 성능: 키를 기반으로 값을 빠르게 조회할 수 있습니다.
- 다양한 구현체 제공:
HashMap
,TreeMap
,LinkedHashMap
,Hashtable
등이 존재합니다.
3. 주요 구현 클래스
자바의 Map
인터페이스는 다양한 구현 클래스를 제공하며, 각 클래스는 내부적으로 다른 방식으로 데이터를 관리합니다.
3.1 HashMap
- 해시 테이블 기반의
Map
구현체 - 순서를 보장하지 않음
- 검색, 삽입, 삭제 속도가 빠름 (O(1) 평균 성능)
- 멀티스레드 환경에서 동기화되지 않음
- 용도: 빠른 조회가 필요하지만 순서가 중요하지 않은 경우
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("Apple", 3);
hashMap.put("Banana", 2);
hashMap.put("Apple", 5); // 기존 값 덮어쓰기
System.out.println(hashMap); // {Banana=2, Apple=5}
3.2 TreeMap
- 이진 탐색 트리(레드-블랙 트리) 구조를 사용하여 키를 자동 정렬
- 키를 기준으로 오름차순 정렬 (기본적으로
Comparable
또는Comparator
적용 가능) - 검색, 삽입, 삭제 속도가 O(log n)
- 용도: 키를 정렬된 순서로 유지해야 할 때
Map<Integer, String> treeMap = new TreeMap<>();
treeMap.put(3, "Three");
treeMap.put(1, "One");
treeMap.put(2, "Two");
System.out.println(treeMap); // {1=One, 2=Two, 3=Three}
3.3 LinkedHashMap
HashMap
과 유사하지만 삽입 순서를 유지- 내부적으로 이중 연결 리스트를 사용하여 순서를 보존
- 용도: 삽입 순서를 유지하면서 키-값을 저장할 때
Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("Java", 1995);
linkedHashMap.put("Python", 1991);
linkedHashMap.put("C", 1972);
System.out.println(linkedHashMap); // {Java=1995, Python=1991, C=1972}
3.4 Hashtable
HashMap
과 유사하지만 스레드 안전(synchronized)- 멀티스레드 환경에서 동기화를 제공하지만 단일 스레드 환경에서는
HashMap
보다 성능이 느림 - 현대적 개발에서는
ConcurrentHashMap
을 더 많이 사용함
Map<String, Integer> hashtable = new Hashtable<>();
hashtable.put("A", 1);
hashtable.put("B", 2);
System.out.println(hashtable); // {A=1, B=2}
4. 주요 메서드
메서드 | 설명 |
---|---|
put(K key, V value) |
키-값 쌍 추가 또는 기존 값 덮어쓰기 |
get(Object key) |
특정 키에 대한 값 반환 |
remove(Object key) |
특정 키 삭제 |
containsKey(Object key) |
특정 키 포함 여부 확인 |
containsValue(Object value) |
특정 값 포함 여부 확인 |
size() |
Map의 크기 반환 |
isEmpty() |
Map이 비어있는지 확인 |
keySet() |
모든 키 반환 (Set 형태) |
values() |
모든 값 반환 (Collection 형태) |
entrySet() |
모든 키-값 쌍 반환 (Set 형태) |
Map<String, String> map = new HashMap<>();
map.put("A", "Apple");
map.put("B", "Banana");
System.out.println(map.get("A")); // Apple
System.out.println(map.containsKey("B")); // true
System.out.println(map.keySet()); // [A, B]
5. Map vs List vs Set
비교 항목 | Map | List | Set |
---|---|---|---|
중복 허용 | 키 중복 불가, 값 중복 가능 | 중복 허용 | 중복 불가 |
순서 유지 | X (HashMap) / O (LinkedHashMap, TreeMap) | O | X (HashSet, TreeSet) / O (LinkedHashSet) |
접근 방식 | 키 기반 조회 | 인덱스 기반 접근 가능 | 요소 탐색이 주 목적 |
성능 | 빠른 검색 (O(1) HashMap) | 삽입/삭제 O(n) (ArrayList) / O(1) (LinkedList) | 검색 및 삽입이 빠름 (HashSet: O(1)) |
6. 결론
자바의 Map
인터페이스는 키-값 쌍을 저장하고 관리하는 데 최적화된 자료구조입니다.
특정 작업에 맞는 구현체(HashMap
, TreeMap
, LinkedHashMap
, Hashtable
)를 선택하면 보다 효율적인 성능을 얻을 수 있습니다.