Language/Java / / 2023. 7. 6. 12:09

Enum(EnumMap, EnumSet)

반응형

자바 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


장점

  1. 특정한 변수가 가질 수 있는 값을 제한할 수 있다. 따라서 타입-세이프티(Type-Safety)를 보장할 수 있다.
  2. 싱글톤 패턴을 구현할 때 사용할 수 있다.

 

※ 만약 우리가 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보다 성능상 효율적인 이유

  1. EnumMap은 값을 찾을 때, 이늄상수가 index정보를 ordinal메서드로 제공하고 있기 때문에, 바로 찾을 수 있다.
  2. 반면, HashMap은 찾을 때, key값을 hash메서드로 index로 변환하고 찾아야 한다.
  3. 값을 넣을 때, EnumMap은 key의 index 정보로 값이 지정된 위치를 장차서 바로 값을 넣는다.
  4. 하지만, HashMap은 key값을 hash로 만들고, 배열의 크기를 조절하는 등의 일이 추가로 필요하다.
  5. 때문에, 배열의 크기가 고정되고 바로 찾을 수 있는 EnumMap이 성능상 훨씬 더 효율적이다.

 

 

반응형

'Language > Java' 카테고리의 다른 글

[Java] 동시성 이슈 해결하기  (0) 2023.08.01
[Java] CountDownLatch  (0) 2023.08.01
[Java] Executors / ExecutorService 사용법  (0) 2023.08.01
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유