[Java] EnumMap 정리

2023. 11. 23. 19:10·Back-End/Java

토이프로젝트를 진행하며 EnumMap을 사용하는 다른 코드들을 보았다.

기존에 나는 Enum을 사용할 때,
Enum 내부에 변수를 추가하는 방식으로 사용하였었지만
Enum 타입을 Map 구조로 다루는 방식과 목적에 대해서 궁금해졌다.

따라서 EnumMap 구조와 장점 사용하는 방식에 대해서 알아보려고 한다.

 

EnumMap이란?

EnumMap 계층 구조(https://www.geeksforgeeks.org/enummap-class-java-example/)

Java에서 특정 Enum 타입의 키를 사용하는 맵이다. (HashMap과 유사)
특히 Enum 상수를 효율적으로 다룰 수 있도록 최적화된 구현을 제공한다.

특징과 성능의 장점을 알아보자.

특징

  • Enum 타입만 key로 사용 가능한 특별한 Map이다.
  • 해싱 과정이 필요 없어 HashMap보다 빠르다.
  • null을 key로 넣는 경우 NullPointerException 발생
  • EnumMap은 내부적으로 배열로 표현되므로 더 나은 성능을 제공한다.
  • 가독성과 유지보수성 향상
  • EnumSet과의 호환성을 가진다.

 

 

HashMap vs EnumMap 성능 최적화

특성 HashMap EnumMap
키 타입 모든 객체 (null 포함) 열거형(enum) 타입
메모리 사용 상대적으로 높은 Overhead 효율적이고 작은 Overhead
순서 순서 보장되지 않음 열거형(enum) 상수의 순서를 따름
성능 (크기가 작을 때) HashMap의 Overhead로 인해 상대적으로 높음 EnumMap이 더 효율적
메모리 초기화 시간 높음 (많은 양의 메모리 할당 및 초기화) 낮음 (EnumMap은 상수 개수에 비례하여 초기화)
코드 가독성 키가 어떤 값인지 명시적으로 알 수 없음 열거형(enum) 상수 사용으로 코드 가독성 향상
활용 예시 다양한 키 타입 및 상황에서 사용 가능 열거형(enum)을 키로 사용하는 경우에 적합

HashMap vs EnumMap 주요 차이점

 

EnumMap을 사용하는 이유는 다음과 같다.

  • EnumMap은 내부적으로 배열을 사용하여 Enum 상수에 대한 매핑을 저장하기 때문에 성능 면에서 효율적이다.
  • EnumMap은 Enum 타입의 순서와 일치하는 순서로 배열을 구성하기 때문에 빠른 검색 및 접근이 가능하다.

즉, EnumMap은 바로 해싱처리를 안 하고 키의 선언순서를 인덱스를 사용한다.

(* 해싱 : key값을 hash function을 통해 index화 시키는 작업)

Enum은 하나의 인스턴스만 생성하는 싱글톤 형태이기 때문에

EnumMap 인스턴스를 생성할 때 Enum의 길이만큼 배열을 생성하여

키의 선언순서를 인덱스로 바로 접근할 수 있다.

 

정리

  1. HashMap은 hashCode()를 사용해 키와 값을 저장하므로 해시 충돌 가능성과 성능의 차이가 존재한다.
  2. EnumMap은 해시를 사용할 필요가 없으므로 충돌 가능성이 없다.

 

Enum 정적, 동적 구조 차이와 목적

Enum 내부에 변수를 추가하는 방식

장점

  • 간결함과 가독성: Enum 내에 변수를 추가하여 데이터와 행위(메서드)를 함께 묶을 수 있어 가독성 좋다.
  • 정적 데이터: Enum은 정적이며 컴파일 시점에 상수로 정의되므로, 데이터의 변경이 필요하지 않을 때 유용하다.

단점

  • 동적 데이터에 부적합: Enum은 정적이기 때문에 동적으로 데이터를 추가하거나 변경하는 데 적합하지 않다.
  • 메모리 소비: 모든 Enum 상수가 프로그램이 실행되는 동안 항상 메모리에 로드되므로, 큰 데이터셋에는 부적합할 수 있다.

 

EnumMap을 사용하는 방식

장점

  • 동적 데이터 지원: EnumMap은 동적으로 데이터를 추가하거나 변경하는 데 용이하다.
  • 메모리 효율적: 필요한 경우에만 EnumMap을 생성하므로 메모리를 효율적으로 사용할 수 있다.
  • 확장성: 데이터셋이 동적으로 변경되거나 많은 양의 데이터가 있는 경우에 유연하게 대처할 수 있다. 

단점

  • Enum과의 분리: EnumMap을 사용하면 데이터와 행위(메서드)가 Enum 내부에 함께 정의되지 않으므로 가독성이 떨어질 수 있다.

 

일반적으로 데이터가 정적이고 작은 경우 Enum 내부에 변수를 추가하는 방식이 간편하고 효과적이다.
반면에 데이터가 동적이거나 큰 경우 EnumMap을 사용하여 필요에 따라
데이터를 효율적으로 관리하는 것이 더 나을 수 있다.

 

reference

EnumMap을 써야 하는 이유 

 

EnumMap을 써야하는 이유

Enum을 Key값으로 써야하는 Map을 만들 때 어떻게 해야할까? 흠,, 그냥 HashMap을 쓰면 되나..? 이때 java에서 Enum을 효과적으로 Map형태로 사용할 수 있는 EnumMap을 제공한다. 왜 EnumMap을 사용해야하는지 A

foot-develop.tistory.com

https://www.geeksforgeeks.org/enummap-class-java-example/

 

EnumMap class in Java - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

'Back-End > Java' 카테고리의 다른 글

[Java] Java 11 vs Java 17, JDK 17 정리  (0) 2023.10.14
[Java] 함수 파라미터의 final 키워드를 사용하는 이유  (0) 2023.05.08
[자료구조] Java 우선순위 큐(Priority Queue)  (0) 2023.02.03
[Java] StringBuffer, StringBuilder  (0) 2022.12.31
'Back-End/Java' 카테고리의 다른 글
  • [Java] Java 11 vs Java 17, JDK 17 정리
  • [Java] 함수 파라미터의 final 키워드를 사용하는 이유
  • [자료구조] Java 우선순위 큐(Priority Queue)
  • [Java] StringBuffer, StringBuilder
COBI-98
COBI-98
배운 것을 응용하기 위해 기록하는 것을 선호하며 백엔드를 공부하고 있습니다.
  • COBI-98
    은로그
    COBI-98
  • 전체
    오늘
    어제
    • 은로그 (79)
      • Back-End (32)
        • Java (5)
        • Spring (16)
        • DB (1)
        • 알고리즘 (7)
        • ETC (2)
      • 개발 일기 (0)
      • 회고 (4)
      • Project (10)
        • 협업프로젝트 (7)
        • 국비프로젝트 (2)
      • Web (2)
        • Server (2)
      • Git (2)
      • CS (0)
      • 코딩테스트 (24)
        • 백준 (17)
        • 프로그래머스 (7)
      • 우아한 테크코스 (5)
  • 블로그 메뉴

    • ✨깃허브
    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    깊이 우선 탐색
    inflean
    백준
    김영한님
    elk
    우아한테크코스
    백준Java
    그리디 알고리즘
    배달의민족
    2단계
    큐
    우테코
    DFS
    N과 M
    Java
    재귀함수
    인프런
    배민
    BFS
    백트래킹
    재귀알고리즘
    레벨2
    Spring
    프로그래머스
    코딩테스트
    김영한강의
    우아한형제들
    코테
    백엔드
    재귀
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
COBI-98
[Java] EnumMap 정리
상단으로

티스토리툴바