토이프로젝트를 진행하며 EnumMap을 사용하는 다른 코드들을 보았다.
기존에 나는 Enum을 사용할 때,
Enum 내부에 변수를 추가하는 방식으로 사용하였었지만
Enum 타입을 Map 구조로 다루는 방식과 목적에 대해서 궁금해졌다.
따라서 EnumMap 구조와 장점 사용하는 방식에 대해서 알아보려고 한다.
EnumMap이란?
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의 길이만큼 배열을 생성하여
키의 선언순서를 인덱스로 바로 접근할 수 있다.
정리
- HashMap은 hashCode()를 사용해 키와 값을 저장하므로 해시 충돌 가능성과 성능의 차이가 존재한다.
- EnumMap은 해시를 사용할 필요가 없으므로 충돌 가능성이 없다.
Enum 정적, 동적 구조 차이와 목적
Enum 내부에 변수를 추가하는 방식
장점
- 간결함과 가독성: Enum 내에 변수를 추가하여 데이터와 행위(메서드)를 함께 묶을 수 있어 가독성 좋다.
- 정적 데이터: Enum은 정적이며 컴파일 시점에 상수로 정의되므로, 데이터의 변경이 필요하지 않을 때 유용하다.
단점
- 동적 데이터에 부적합: Enum은 정적이기 때문에 동적으로 데이터를 추가하거나 변경하는 데 적합하지 않다.
- 메모리 소비: 모든 Enum 상수가 프로그램이 실행되는 동안 항상 메모리에 로드되므로, 큰 데이터셋에는 부적합할 수 있다.
EnumMap을 사용하는 방식
장점
- 동적 데이터 지원: EnumMap은 동적으로 데이터를 추가하거나 변경하는 데 용이하다.
- 메모리 효율적: 필요한 경우에만 EnumMap을 생성하므로 메모리를 효율적으로 사용할 수 있다.
- 확장성: 데이터셋이 동적으로 변경되거나 많은 양의 데이터가 있는 경우에 유연하게 대처할 수 있다.
단점
- Enum과의 분리: EnumMap을 사용하면 데이터와 행위(메서드)가 Enum 내부에 함께 정의되지 않으므로 가독성이 떨어질 수 있다.
일반적으로 데이터가 정적이고 작은 경우 Enum 내부에 변수를 추가하는 방식이 간편하고 효과적이다.
반면에 데이터가 동적이거나 큰 경우 EnumMap을 사용하여 필요에 따라
데이터를 효율적으로 관리하는 것이 더 나을 수 있다.
reference
https://www.geeksforgeeks.org/enummap-class-java-example/
'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 |