java.util.EnumMap 클래스는 enum 타입의 키를 위해 특별히 설계된 Map 구현체입니다. 일반 HashMap보다 메모리 효율이 뛰어나고 조회 속도가 빠르기 때문에, 키가 enum으로 한정되는 경우라면 EnumMap을 사용하는 것이 좋은 선택입니다.
EnumMap의 주요 특징
EnumMap의 모든 키는 반드시 하나의 enum 타입에서 가져와야 하며, 이 enum 타입은 맵 생성 시 명시적 또는 암묵적으로 지정됩니다.
EnumMap은 키의 자연스러운 순서(natural order), 즉 enum 상수가 선언된 순서대로 요소를 유지합니다.
EnumMap은 동기화(synchronized)되지 않습니다. 여러 스레드가 동시에 하나의 EnumMap에 접근하고, 그중 최소한 하나의 스레드가 맵을 수정한다면 외부에서 별도로 동기화 처리를 해주어야 합니다.
내부적으로 배열 기반으로 구현되어 있어 HashMap에 비해 성능과 메모리 측면에서 유리합니다.
EnumMap 생성자 종류
EnumMap 클래스는 다음과 같은 세 가지 생성자를 제공합니다.
| 번호 | 생성자 및 설명 |
|---|---|
| 1 | EnumMap(Class<K> keyType) 지정된 키 타입(keyType)을 가지는 비어 있는 EnumMap을 생성합니다. |
| 2 | EnumMap(EnumMap<K,? extends V> m) 지정된 EnumMap과 동일한 키 타입을 가지며, 원본 맵의 모든 매핑(존재하는 경우)을 포함하는 새로운 EnumMap을 생성합니다. |
| 3 | EnumMap(Map<K,? extends V> m) 지정된 일반 Map으로부터 초기화된 EnumMap을 생성합니다. |
예제 1: EnumMap 생성과 clone() 활용
다음 예제는 EnumMap을 생성하고 값을 저장한 뒤, clone() 메서드로 맵을 복제하는 방법을 보여줍니다.
import java.util.EnumMap;
public class Demo {
// enum 선언
public enum Numbers {
ONE, TWO, THREE, FOUR, FIVE
};
public static void main(String[] args) {
EnumMap<Numbers, String> map1 = new EnumMap<>(Numbers.class);
EnumMap<Numbers, String> map2 = new EnumMap<>(Numbers.class);
// map1에 값 연결
map1.put(Numbers.ONE, "1");
map1.put(Numbers.TWO, "2");
map1.put(Numbers.THREE, "3");
map1.put(Numbers.FOUR, "4");
// 전체 맵 출력
System.out.println("map1:" + map1);
// map1을 map2로 복제
map2 = map1.clone();
// map2 출력
System.out.println("map2:" + map2);
}
}
실행 결과
map1:{ONE=1, TWO=2, THREE=3, FOUR=4}
map2:{ONE=1, TWO=2, THREE=3, FOUR=4}
출력 결과에서 확인할 수 있듯이, clone()을 통해 복제된 map2는 원본인 map1과 동일한 내용을 가지며, enum의 선언 순서대로 정렬되어 출력됩니다.
예제 2: size()로 매핑 개수 확인하기
다음 예제는 맵에 저장된 키-값 매핑의 개수를 size() 메서드로 확인하고, 새로운 항목 추가 시 개수가 어떻게 변하는지 보여줍니다.
import java.util.*;
public class EnumMapDemo {
// enum 선언
public enum Numbers {
ONE, TWO, THREE, FOUR, FIVE
};
public static void main(String[] args) {
EnumMap<Numbers, String> map = new EnumMap<>(Numbers.class);
// 맵에 값 연결
map.put(Numbers.ONE, "1");
map.put(Numbers.TWO, "2");
map.put(Numbers.THREE, "3");
map.put(Numbers.FOUR, "4");
// 맵 출력
System.out.println("Map: " + map);
// 현재 매핑 개수 출력
System.out.println("Number of mappings:" + map.size());
// Numbers.FIVE 값 추가
map.put(Numbers.FIVE, "5");
// 추가 후 매핑 개수 출력
System.out.println("Number of mappings:" + map.size());
}
}
실행 결과
Map: {ONE=1, TWO=2, THREE=3, FOUR=4}
Number of mappings:4
Number of mappings:5
처음에는 4개의 매핑이 저장되어 있었지만, put()으로 Numbers.FIVE 항목을 추가한 후에는 매핑 개수가 5개로 증가한 것을 확인할 수 있습니다.
정리
EnumMap은 키가 enum 타입으로 한정될 때 사용할 수 있는 최적화된 Map 구현체입니다. 배열 기반 구조 덕분에 빠른 성능을 제공하며, enum 선언 순서를 유지한다는 점이 특징입니다. 다만 멀티스레드 환경에서는 외부 동기화가 필요하다는 점을 기억해야 합니다.