티스토리 뷰

Java

EnumMap(EnumSet) 쓰면 좋을까? (vs HashMap)

사용자 siyoon210 2019. 6. 6. 13:09
반응형

개요

Map에 많은 구현체들이 있지만 주로 HashMap을 사용하고 상황에 따라 TreeMap이나 LinkedHashMap정도를 고려해보는 것이 현실입니다. Hash를 사용하는 HashMap이면 성능적으로 충분히 훌륭하지 않은가 생각했는데, EnumMap이 HashMap보다 성능적으로 훨씬 좋다는 사실을 알게 되었습니다.

 

EnumMap 이 뭘까

EnumMap도 Map의 구현체입니다. 대신 한가지 조건이 있는데 key값으로 enum이 들어가야 합니다.

enum DayOfWeek {
    MON, TUE, WED, THU, FRI, SAT, SUN
}

public static void main(String[] args) {
    Map<DayOfWeek, String> enumMap = new EnumMap<>(DayOfWeek.class);//키에 들어갈 enum클래스를 생성자로 알려준다. 
}

 

HashMap이나 TreeMap보다 좋은 점이 뭘까

1. 성능이 좋다.

Hash는 다른 어떤 방식보다도 검색에 빠르지만, 이를 위해서는 해싱 작업이 필요합니다. 하지만 enum은 단일 객체임을 보장할 수 있기 때문에 이러한 작업이 필요 없습니다.

 

그러면 HashMap보다 얼마나 빠를까요?
Map의 특정 값을 천만번 반복해서 가져오는 코드를 작성해보았습니다.

private static void calcGetPerformance(Map<DayOfWeek, String> map) {
    long[] testCase = new long[10]; //천만번 가져오는 과정을 10번 반복한다.

    for (int i = 0; i < testCase.length; i++) {
        long startTime = System.nanoTime();
        for (int j = 0; j < 10_000_000; j++) {
            map.get(DayOfWeek.THU); 
        }
        long endTime = System.nanoTime();
        testCase[i] = endTime - startTime;
    }

    long sum = 0;
    for (final long l : testCase) {
        sum += l;

        if (sum < 0) {
            System.out.println("------오버플로우 남---- : " + sum);
        }
    }

    System.out.println(sum / testCase.length);
    //천만번 가져오는 과정을 10번 반복하고 평균값을 구한다.
}

재미없는 코드는 대충 넘어가자. (자세한 코드는 깃헙에 올려두었습니다. https://github.com/siyoon210/Java-Practice/blob/master/src/practice/enummapenumset/EnumMapTest.java)

 

결과는
HashMap은 보통 24,000,000 nano초
EnumMap은 보통 16,000,000 nano초
가 소요되었습니다. EnumMap이 HashMap보다 1.5배 정도 빠르다는 것을 확인할 수 있었습니다.

 

2. 순서를 기억한다.

탐색 성능도 빠른데 TreeMap의 장점도 가지고 있습니다. 순서를 기억한다는 점입니다. 단, 여기서 말하는 순서는 사용자가 입력한 순서가 아니라 Enum에 명시되어 있는 순서를 말합니다. 이미 순서가 정해져 있기 때문에, TreeMap처럼 정렬된다 하더라도 입력 시 성능이 우수합니다.

한 줄 요약

Map의 key값이 enum이라면 EnumMap을 사용하자. HashMap보다 빠르고 TreeMap처럼 순서도 기억한다! (자매품인 EnumSet도 있다.)

 

참고자료

반응형
댓글
댓글쓰기 폼