EnumMap이란 무엇인가?
EnumMap은 JDK 5에서 처음 도입된 클래스로, enum 타입을 Map의 키(key)로 사용하도록 특별히 설계된 Map 인터페이스의 구현체입니다. EnumMap에 저장되는 모든 키는 반드시 동일한 enum 타입이어야 하며, 키로 null을 허용하지 않습니다. 만약 null 키를 사용하려고 하면 NullPointerException이 발생합니다.
공식 자바 문서(Java Docs)에는 다음과 같이 설명되어 있습니다.
EnumMap은 내부적으로 배열(array)을 사용하여 구현되며, 이러한 구조 덕분에 매우 컴팩트하고 효율적인 성능을 제공합니다.
HashMap이란 무엇인가?
HashMap 역시 Map 인터페이스의 대표적인 구현체입니다. 데이터를 키(Key)와 값(Value) 쌍의 형태로 저장하며, 하나의 null 키와 여러 개의 null 값을 허용합니다. 단, HashMap의 키는 원시 타입(primitive type)일 수 없으며 반드시 객체 타입이어야 합니다.
해시 함수가 요소들을 버킷(bucket)에 적절하게 분산시킨다는 가정 하에, HashMap은 get과 put 같은 기본 연산에서 일정 시간(constant-time)의 성능을 보장합니다.
EnumMap vs HashMap 주요 차이점 비교표
| 번호 | 구분 | EnumMap | HashMap |
|---|---|---|---|
| 1 | 기본 정의 | enum 타입 키를 위해 특화된 Map 구현체입니다. | Map 인터페이스의 일반적인 구현체입니다. |
| 2 | Null 키 처리 | null 키를 가질 수 없습니다. | 하나의 null 키와 여러 개의 null 값을 허용합니다. |
| 3 | 성능 | 모든 연산이 일정 시간(constant time)에 실행되므로 HashMap보다 빠릅니다. | 해싱 과정이 필요하기 때문에 EnumMap보다 느립니다. |
| 4 | 내부 구현 | 내부적으로 배열(Array)을 사용합니다. | 내부적으로 해시 테이블(Hashtable)을 사용합니다. |
| 5 | 순서 유지 | 키를 enum 상수가 선언된 자연스러운 순서(natural order)대로 저장합니다. | 요소의 순서를 보장하지 않습니다. |
EnumMap 예제 코드
import java.util.EnumMap;
import java.util.Map;
public class EnumMapExample {
public enum LaptopEnum {
HCL, DELL, IBM
}
public static void main(String[] args) {
// EnumMap 생성
EnumMap<LaptopEnum, String> map = new EnumMap<>(LaptopEnum.class);
map.put(LaptopEnum.HCL, "100");
map.put(LaptopEnum.DELL, "200");
map.put(LaptopEnum.IBM, "300");
// 맵 출력
for (Map.Entry<LaptopEnum, String> m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
}
}HashMap 예제 코드
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
// HashMap 생성
Map<String, String> map = new HashMap<>();
map.put("HCL", "100");
map.put("DELL", "200");
map.put("IBM", "300");
// 맵 출력
for (Map.Entry<String, String> m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
}
}정리
키가 특정 enum 타입으로 한정되어 있다면 EnumMap을 사용하는 것이 성능과 메모리 측면에서 더 유리합니다. 반면, 다양한 객체 타입의 키를 사용해야 하거나 null 키가 필요하다면 HashMap이 적합한 선택입니다. 각 클래스의 특징과 제약 조건을 이해하고 상황에 맞게 활용하는 것이 중요합니다.