Home Enum Map
Post
Cancel

Enum Map

Enum Map?

  • Enum 타입만 Key로 사용 가능한 Map
  • Array를 이용해 성능적으로 우수하다.
  • 해싱 과정이 필요없어 HashMap보다 빠르다.
  • null을 Key로 넣는 경우 NullPointerException이 발생한다.
  • thread-safe 하지 않다.

Enum Map을 thread-safe하게 사용하고 싶다면 아래와 같이 감싸는 방법이 있다.

1
Collections.synchronizedMap(new EnumMap<Key, V>(...));

성능이 우수하다.

EnumMap은 배열 형태로 이루어져있기 때문에 다른 Map에 비해 성능이 우수하다.

우선 HashMap과 TreeMap의 차이점을 보자.

get / put / remove complexity가 HashMap의 경우에는 O(1)으로 나타난다.

그렇다면 HashMap도 EnumMap이랑 비슷하거나 더 좋은게 아닐까? 라는 의문이 들 수도 있다.

하지만 HashMap은 hashCode()를 사용해 키와 값을 저장하므로 해시 충돌 가능성이 존재한다.

EnumMap은 해시를 사용할 필요가 없으므로 충돌 가능성이 없다는 것에서 차이가 발생한다.

Key를 제한할 수 있다.

key에 들어갈 값을 생성 시 정의하기 때문에 Enum 타입 외에는 key로 만들 수 없다.

null 값을 key로 만드는 것도 제한한다. (HashMap에는 null을 넣을 수 있다.)

예시

1등부터 5등까지 상금을 담고 있는 Ranking이라는 Enum을 생성했다.

각 등수마다 몇 명이 존재하는지 저장하기 위해 아래와 같은 Map을 생성했다.

1
2
3
Map<Ranking, Integer> winningResult = new LinkedHashMap<>();

Map<Ranking, Integer> winningResult = new EnumMap<>(Ranking.class);
1
2
3
4
5
6
private void initialMap() { 
	Ranking[] rankings = Ranking.values(); 
	for (Ranking ranking : rankings) { 
		winningResult.put(ranking, 0); 
	} 
}

LinkedHashMap으로 만든 경우에는 위와 같이 순서를 지정하기 위한 작업이 필요하다.

하지만 EnumMap은 생성 시 Enum에 정의된 순서를 따른다. keySet(), entrySet(), values()를 호출하면 이 순서를 확인할 수 있다.

This post is licensed under CC BY 4.0 by the author.