java
Map 에 관하여
heejunp
2025. 2. 18. 22:08
Java에서 Map 인터페이스는 키-값(Key-Value) 쌍을 저장하는 자료구조입니다. Map은 키의 중복을 허용하지 않으며, List나 Set과는 다르게 특정 키를 사용하여 값을 효율적으로 조회할 수 있도록 설계되었습니다.
Java에서 Map 인터페이스의 대표적인 구현체는 HashMap, LinkedHashMap, TreeMap, Hashtable 등이 있습니다. 이 글에서는 각 구현체의 특징과 성능을 비교하고 적절한 사용 사례를 살펴보겠습니다.
1. Map 인터페이스란?
Map 인터페이스는 java.util 패키지에 속하며, 다음과 같은 특징을 가집니다:
- 키-값(Key-Value) 쌍 저장
- 키의 중복을 허용하지 않음
- 값은 중복 가능
- 빠른 검색 및 삽입 제공 (O(1) 또는 O(log n))
Java의 Map 인터페이스를 구현한 클래스에는 다음과 같은 주요 구현체들이 있습니다:
- HashMap
- LinkedHashMap
- TreeMap
- Hashtable
2. 주요 Map 구현체 비교
2.1 HashMap
HashMap은 해시 테이블(Hash Table) 기반의 Map 구현체로, 가장 널리 사용됩니다.
특징:
- 순서를 보장하지 않음
- 검색 및 삽입 속도가 빠름 (O(1))
- null 키와 null 값 허용
- Thread-safe 하지 않음
사용 예제:
import java.util.*;
public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 10);
map.put("Banana", 20);
map.put("Cherry", 30);
System.out.println(map); // 출력 예: {Banana=20, Apple=10, Cherry=30} (순서는 랜덤)
}
}
사용 사례:
- 빠른 검색과 삽입이 필요한 경우
- 순서 유지가 필요 없는 경우
2.2 LinkedHashMap
LinkedHashMap은 HashMap의 특징을 유지하면서 키의 삽입 순서를 보장하는 Map 구현체입니다.
특징:
- 요소의 삽입 순서 유지
- 검색 및 삽입 속도 (O(1))
- null 키와 null 값 허용
- 메모리 사용량이 HashMap보다 큼 (이중 연결 리스트 사용)
사용 예제:
import java.util.*;
public class LinkedHashMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new LinkedHashMap<>();
map.put("Dog", 100);
map.put("Cat", 200);
map.put("Horse", 300);
System.out.println(map); // 출력: {Dog=100, Cat=200, Horse=300} (삽입 순서 유지)
}
}
사용 사례:
- 삽입 순서를 유지하면서도 빠른 검색과 삽입이 필요한 경우
- 최근 사용한 데이터를 유지하는 캐시(Cache) 구현 시 사용
2.3 TreeMap
TreeMap은 이진 검색 트리(Red-Black Tree) 기반의 Map 구현체로, 키를 자동 정렬된 상태로 저장합니다.
특징:
- 자동 정렬 유지 (오름차순, Comparator 사용 시 커스텀 정렬 가능)
- 검색 성능 우수 (O(log n))
- null 키 허용 불가 (값은 null 허용)
- 메모리 사용량이 HashMap보다 큼
사용 예제:
import java.util.*;
public class TreeMapExample {
public static void main(String[] args) {
Map<Integer, String> map = new TreeMap<>();
map.put(30, "Thirty");
map.put(10, "Ten");
map.put(20, "Twenty");
System.out.println(map); // 출력: {10=Ten, 20=Twenty, 30=Thirty} (오름차순 정렬 유지)
}
}
사용 사례:
- 자동 정렬이 필요한 경우
- 범위 검색(첫 번째, 마지막 키 찾기)이 필요한 경우
2.4 Hashtable
Hashtable은 해시 테이블 기반의 Map 구현체이며, HashMap과 유사하지만 동기화(Synchronized)가 적용되어 있습니다.
특징:
- Thread-safe (멀티스레드 환경에서 사용 가능)
- 순서를 보장하지 않음
- null 키와 null 값 허용하지 않음
- 성능이 HashMap보다 떨어짐 (동기화 오버헤드 존재)
사용 예제:
import java.util.*;
public class HashtableExample {
public static void main(String[] args) {
Map<String, Integer> map = new Hashtable<>();
map.put("Red", 500);
map.put("Blue", 600);
map.put("Green", 700);
System.out.println(map); // 출력 예: {Green=700, Red=500, Blue=600} (순서는 랜덤)
}
}
사용 사례:
- 멀티스레드 환경에서 동기화된 Map이 필요한 경우
- HashMap을 사용할 수 없는 동기화가 필수적인 환경
3. 마무리
- HashMap: 빠른 검색과 삽입이 필요하고, 순서가 중요하지 않은 경우
- LinkedHashMap: 삽입 순서를 유지하면서 빠른 검색이 필요한 경우
- TreeMap: 자동 정렬이 필요하거나 범위 검색이 중요한 경우
- Hashtable: 동기화가 필요한 멀티스레드 환경에서 사용