🌟 공통점
- 키와 값의 쌍으로 데이터를 저장합니다.
- Map 인터페이스를 구현하여 키를 사용해 값을 빠르게 조회할 수 있습니다.
- 키는 중복 불가하고, 각 키는 하나의 값에만 매핑됩니다.
하지만 이 세 클래스는 사용 목적과 동작 방식에서 큰 차이를 보입니다.
1️⃣ HashMap
🧐 특징
- 비동기적: 멀티스레드 환경에서 안전하지 않음.
- Null 허용: 하나의 null 키와 여러 null 값을 허용합니다.
- 성능 최적화: 동기화를 지원하지 않기 때문에 단일 스레드 환경에서 빠른 성능을 자랑합니다.
📖 예제
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put(null, 3);
System.out.println(map);
}
}
출력:
{null=3, A=1, B=2}
2️⃣ HashTable
🧐 특징
- 동기화 지원: 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
- Null 비허용: 키와 값 모두 null을 허용하지 않습니다.
- 오래된 클래스: HashMap보다 성능이 떨어지며, 현재는 사용되지 않습니다.
📖 예제
import java.util.Hashtable;
public class HashTableExample {
public static void main(String[] args) {
Hashtable<String, Integer> table = new Hashtable<>();
table.put("A", 1);
table.put("B", 2);
// table.put(null, 3); // NullPointerException 발생
System.out.println(table);
}
}
출력:
{A=1, B=2}
3️⃣ ConcurrentHashMap
🧐 특징
- 고성능 동기화: 멀티스레드 환경에서도 높은 성능을 유지합니다.
- 내부적으로 분할 잠금(lock) 메커니즘을 사용합니다.
- Null 비허용: 키와 값 모두 null을 허용하지 않습니다.
- Java 1.5부터 추가.
📖 예제
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentHashMapExample {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> cmap = new ConcurrentHashMap<>();
cmap.put("A", 1);
cmap.put("B", 2);
// cmap.put(null, 3); // NullPointerException 발생
System.out.println(cmap);
}
}
출력:
{A=1, B=2}
📊 비교표
특성 | HashMap | HashTable | ConcurrentHashMap |
동기화 | ❌ 비동기적 | ✅ 동기화 지원 | ✅ 고성능 동기화 |
Null 허용 여부 | ✅ 허용 | ❌ 비허용 | ❌ 비허용 |
성능 | 빠름 | 느림 | 멀티스레드에서 빠름 |
사용 시점 | 단일 스레드 | 레거시 코드 | 멀티스레드 환경 |
🔍 어떤 것을 선택해야 할까?
- 단일 스레드 환경: HashMap을 사용하세요. 성능이 가장 좋습니다.
- 멀티스레드 환경:
- 낮은 동시성 요구: Collections.synchronizedMap(new HashMap<>())를 사용할 수 있습니다.
- 높은 동시성 요구: ConcurrentHashMap
- 레거시 코드:HashTable은 이제 사용하지 않습니다. ConcurrentHashMap으로 바꾸세요.
'IT 개발 라이프 > Back_End' 카테고리의 다른 글
디자인 패턴 이란? + 예시 (0) | 2025.01.03 |
---|---|
자바(JAVA) try-with-resources (0) | 2024.12.31 |
자바에서 Generic을 쓰는 이유 (1) | 2024.12.27 |
@Component와 @Configuration란? (1) | 2024.12.26 |
자바(Java)의 메모리 영역 (1) | 2024.12.19 |