EnumMap 이란 키(key) 를 특정 Enum 타입만을 사용하도록 하는 Map 인터페이스의 구현체입니다. Map 에 대한 구현체이므로, 당연히 Map 에서 제공하는 메소드들을 모두 사용 가능합니다.
EnumMap 에 대해서 찾아보길, HashMap
과 같은 Map 구현체들에 비해서 빠른 성능을 낼 수 있다고 알려져있습니다. 왜 EnumMap 이 다른 구현체들보다 더 빠른 성능을 낼 수 있을까요?
우선 HashMap
의 동작방식에 대해 이해할 필요가 있습니다. Hash 는 어떤 방식보다도 검색에 빠르지만, 이를 위해서는 별도의 해싱 작업이 필요합니다. 즉, HashMap 은 해시 값을 만들고, 해시 충돌(Hash Collision)
에 대응하기 위한 작업 처리가 필요합니다.
반면 EnumMap
은 어떨까요? 우선 Enum
의 특징을 다시 되짚어보면 상수의 선언 순서대로 일정한 순번을 가집니다. 때문에 Enum 객체의 ordinal()
을 활용해서 열거타입 객체의 순번을 가져올 수 있는것이라고 했었습니다.
이렇게 "순번" 정보를 가지고있다는 특징으로 인해, EnumMap 은 내부적으로 배열에다 값을 저장할 수 있고, 실제로 내부적으로 배열에 열겨헝 데이터들을 저장하는 구조합니다. 결국 배열의 인덱싱 및 연산을 떠올려보면, HashMap 과 달리 해싱 및 해싱 충돌작업에 대한 별도의 작업을 수행하지 않습니다.
또한 HashMap 의 경우 데이터의 개수가 많아지고 일정 크기에 도달하면 구조 재조정 작업이 필요하지만, EnumMap 의 경우 전달된 Enum 타입의 상수 개수만큼만 저장공간을 확보하면 되므로 이 작업이 필요하지 않습니다.
EnumMpa 의 특징을 정리해보자면, 다음과 같습니다.
생성자에 Enum 클래스 타입을 직접 인자로 전달해야 한다는 것을 유의합시다.
EnumMap<Direction, Ineger> myMap = new EnumMap(Direction.class);
이 외에는 기본적으로 Map 의 구현체이므로, Map 에서 제공하는 모든 기능을 사용할 수 있습니다. 예를들어 get()
을 활용하여 key 에 대한 value 값을 조회할때는, 열거타입 객체를 인자로 넘겨주면 됩니다.
Map<Direction, Integer> directionIntegerMap = new EnumMap<Direction, Integer>(Direction.class);
Integer eastValue = directionIntegerMap.get(Direction.EAST);
특정 날짜의 매핑을 해제하려면 간단히 remove() 를 호출하면 됩니다.
directionIntegerMap.remove(Direction.EAST);