자바 1.5 버전부터 새롭게 추가된 열거형 상수로 서로 연관된 상수들의 집합을 의미한다.
Enum이란?
연관된 상수들의 집합을 의미합니다. 다시 말해 상수 목록을 담을 수 있는 데이터 타입을 의미한다.
우리가 class로 선언하는 부분에 enum이라고 선언하게 되면, 해당 객체는 상수의 집합이라는 의미를 명시적으로 나타냅니다.
java.lang.Enum 클래스
- Enum 클래스는 모든 자바 열거체의 조상 클래스입니다.
- Enum 클래스에는 열거체 조작을 위한 다양한 메서드가 포함되어 있습니다.
1. values()
해당 열거체의 모든 상수를 지정한 배열을 생성해서 반환합니다.
특정 Enum 타입이 가질 수 있는 모든 값을 순회하면서 출력하려면 아래와 같이 하면 됩니다.
enum Rainbow {RED, ORAGNE, YELLOW, GREEN, BLUE, INDIGO, VIOLET}
Arrays.stream(Rainbow.values()).forEach(System.out::println);
2. valueOf()
전달된 문자열과 일치하는 해당 열거체의 상수를 반환합니다.
3. ordinal()
해당 열거체 상수가 열거체 정의에서 정의된 순서(0부터 시작)를 반환합니다.
4. 대표적인 Enum 메서드
Enum 클래스의 메서드는 다음과 같습니다.
static E values() | 해당 열거체의 모든 상수를 저장한 배열을 생성하여 반환함. |
static E valueOf(String name) | 전달된 문자열과 일치하는 해당 열거체의 상수를 반환함. |
protected void finalize() | 해당 Enum 클래스가 final 메소드를 가질 수 없게 됨. |
String name() | 해당 열거체 상수의 이름을 반환함. |
int ordinal() | 해당 열거체 상수가 열거체 정의에서 정의된 순서(0부터 시작)를 반환함. |
▼ 참고
http://www.tcpschool.com/java/java_api_enum
장점
- 특정한 변수가 가질 수 있는 값을 제한할 수 있다. 따라서 타입-세이프티(Type-Safety)를 보장할 수 있다.
- 싱글톤 패턴을 구현할 때 사용할 수 있다.
※ 만약 우리가 Enum을 사용하지 않고, int 및 String 등으로 사용하게 되면 방어할 수 있는 code가 필요하다.
[타입-세이프티(Type-Safety)]
Type Safe는 타입의 안정을 의미합니다. 즉, Runtime시가 아닌 컴파일 시 문제를 잡을 수 있다는 것을 의미합니다.
참고
- enum은 자바 class처럼 생성자, 메서드, 필드를 가질 수 있습니다.
- enum은 값을 == 연산자로 동일성을 비교할 수 있습니다.
- enum을 key로 사용하는 Map을 정의하고, enum을 담고 있는 Set을 만들기 위해서는 EnumMap, EnumSet을 사용하는 게 좋습니다.
EnumMap
hashMap은 key를 bucket에 저장하고 각 bucket이 LinkedList를 참조하고 있습니다.
enumMap은 key로 사용할 값을 제한합니다. 따라서 그 개수만큼 길이를 가진 array를 선언하고 해당 index에 값만 넣으면 됩니다.
EnumSet
hashSet은 hashMap과 동일합니다. map의 value가 있다/없다를 표기하는 지시자가 들어갑니다.
enumSet은 있다/없다만 표시하면 되기 때문에, enumMap처럼 array가 아닌 bitvector(10110101)로 구현됩니다.
✅ EnumMap이 HashMap보다 성능상 효율적인 이유
- EnumMap은 값을 찾을 때, 이늄상수가 index정보를 ordinal메서드로 제공하고 있기 때문에, 바로 찾을 수 있다.
- 반면, HashMap은 찾을 때, key값을 hash메서드로 index로 변환하고 찾아야 한다.
- 값을 넣을 때, EnumMap은 key의 index 정보로 값이 지정된 위치를 장차서 바로 값을 넣는다.
- 하지만, HashMap은 key값을 hash로 만들고, 배열의 크기를 조절하는 등의 일이 추가로 필요하다.
- 때문에, 배열의 크기가 고정되고 바로 찾을 수 있는 EnumMap이 성능상 훨씬 더 효율적이다.
'Language > Java' 카테고리의 다른 글
[Java] 동시성 이슈 해결하기 (0) | 2023.08.01 |
---|---|
[Java] CountDownLatch (0) | 2023.08.01 |
[Java] Executors / ExecutorService 사용법 (0) | 2023.08.01 |