Java) Enum으로 Set, Map을 쓰려면 EnumSet, EnumMap을 쓰자!

나가을·2024년 6월 20일
0

java

목록 보기
8/12

EnumSet, EnumMap을 사용하는 주된 이유는 열거형에 특별히 최적화되어 있기 때문이다.

1) EnumSet,EnumMap과 HashMap,HashSet의 가장 큰 차이점은 EnumMap,EnumSet은 열거형 키에 최적화 되어 있다.
EnumMap,EnumSet에서는 Enum 이외의 다른 유형을 키로 사용할 수 없지만,
HashSet, HashMap에서는 Enum과 다른 객체를 모두 키로 사용할 수 있다.

2) 또 다른 차이점은 성능이다. 앞서 설명한 것처럼 Enum 키에 대한 특수 최적화가 이루어졌기 때문에 Enum을 키 객체로 사용할 때 EnumMap이 HashMap보다 성능이 더 좋을 가능성이 높다.

3) 중요한 차이점은 충돌 확률이다. EnumMap은 내부적으로 배열로 유지되며, EnumMap의 put() 메서드에서 다음과 같은 코드를 사용하여 서수(ordinal)를 통해 자연스러운 순서로 값을 저장한다.

int index = ((Enum)key).ordinal();
Object oldValue = vals[index];
vals[index] = maskNull(value);

이를 쉽게 풀어서 설명하면 다음과 같다.

  1. EnumMap은 각 Enum 값에 고유한 서수(ordinal)를 할당한다.
  2. put() 메서드를 호출할 때 Enum 값의 서수를 사용하여 배열의 특정 위치에 값을 저장한다.
  3. ordinal() 메서드를 사용하여 해당 Enum 값의 서수를 가져온다.
  4. 서수를 배열의 인덱스로 사용하여 해당 위치에 값을 저장하거나 업데이트한다.

이 과정에서 충돌이 발생하지 않는 이유는 각 Enum 값이 고유한 서수를 가지기 때문이다. 이는 HashMap이 해시 함수를 통해 값을 저장하는 방식과 다르다. HashMap은 해시 함수를 사용하여 키의 해시 코드를 계산하고, 이 해시 코드에 기반하여 값을 저장할 위치를 결정한다. 이 과정에서 서로 다른 키가 동일한 해시 코드를 가질 가능성, 즉 충돌이 발생할 수 있다.

따라서, EnumMap은 충돌 확률이 낮고, Enum 값의 서수를 사용하여 값을 저장하므로 메모리와 성능 면에서 더 효율적이다.

profile
도라도라 코딩나라

0개의 댓글