enum 정의하는 방법
enum을 사용했을 때 얻을 수 있는 장점
- 열거체를 비교할 때 실제 값뿐만 아니라 타입까지도 체크한다
- 열거체의 상숫값이 재정의되더라도 다시 컴파일할 필요가 없다.
- 문자열과 비교해, IDE의 적극적인 지원을 받을 수 있다
- 자동완성, 오타검증, 텍스트 리팩토리 등
- 허용 가능한 값들을 제한할 수 있다
- 리팩토링시 변경 범위가 최소화된다.
enum 정의 및 사용
// enum 열거체이름 { 상수1이름, 상수2이름, ... }
enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }
// 열거체이름.상수이름
Rainbow.RED
enum의 상숫값 정의 및 추가
enum Rainbow {
RED(3), ORANGE(10), YELLOW(21), GREEN(5), BLUE(1), INDIGO(-1), VIOLET(-11);
private final int value;
Rainbow(int value) { this.value = value; }
public int getValue() { return value; }
}
enum이 제공하는 메소드 (values()와 valueOf())
values() method
해당 열거체의모든 상수를 저장한 배열을 생성하여 반환한다.
enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }
public class Enum01 {
public static void main(String[] args) {
Rainbow[] arr = Rainbow.values();
for (Rainbow rb : arr) {
System.out.println(rb);
}
}
}
/********************
실행 결과
RED
ORANGE
YELLOW
GREEN
BLUE
INDIGO
VIOLET
********************/
valueOf() Method
전달된 문자열과 일치하는 해당 열거체의 상수를 반환한다.
enum Rainbow { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }
public class Enum02 {
public static void main(String[] args) {
Rainbow rb = Rainbow.valueOf("GREEN");
System.out.println(rb);
}
}
// 실행 결과
// GREEN
java.lang.Enum
enum 클래스는 모든 자바 열거체의 공통된 조상 클래스이다
enum 클래스에는 열거체를 조작하기 위한 다양항 메소드가 포함되어 있다.
Method | 설명 |
protected void finalize() | 해당 Enum 클래스가 final 메소드를 가질 수 없게 됨 |
String name() | 해당 열거체 상수의 이름을 반환 |
int ordinal | 해당 열거체 상수가 열거체 정의에서 정의된 순서(0부터 시작)를 반환 |
EnumSet
EnumSet이란?
enum 클래스로 작동하기 위해 특화된 Set 컬렉션(데이터를 중복 저장할 수 없고, 순서가 보잔되지 않는 자료구조)이라고 할 수 있다.
EnumSet은 Set 인터페이슬 구현하고, AbstractSet을 상속한다.
EnumSet은 추상 클래스이며, 인스턴스 생성을 위한 다양한 정적 팩토리 메소드가 정의되어있다. JDK에서는 RegularEnumSet, JumboEnumSet 2가지의 EnumSet 구현체를 제공한다.
RegularEnumSet
비트 벡터를 표현하기 위해 단일 long 자료형을 사용한다. long의 각 비트는 enum 값을 나타낸다. 열거형의 i번째 값은 i번째 비트에 저장되므로 값이 잇는지 여부를 쉽게 알 수 있다. long이 64비트의 데이터이기 때문에 RegularEnumSet은 64개의 원소를 저장할 수 있다.
JumboEnumSet
long 요소의 배열을 비트 벡터로 사용한다. 이를 통해 64개 이상의 원소를 저장한다. RegularEnumSet과 비슷하게 작동하지만, 저장된 배열 인덱스를 찾기 위해 며착지 추가 계산을 수행한다.
EnumSet의 장점
모든 메소드가 산술 비트 연산을 사용하여 구현되므로 일반적인 연산이 매우 빠르게 계산된다.
HashSet과 같은 다른 Set 구현체와 비교했을때, 데이터가 예상 가능한 순서로 저장되어 있고, 각 계산을 하는데 하나의 비트만이 필요하므로 더 빠르다고 할 수 있다.
HashSet처럼 데이터를 저장할 버킷을 찾는데 hashcode를 계산할 필요가 없다.
비트 벡터의 특성상 더 작은 메모리를 사용한다.
EnumSet을 사용할 때 고려 사항
1. 열거형 값만 포함할 수 있으며, 모든 값은 동일한 열거형이어야 한다.
2. null을 추가할 수 없다.
3. Thread에 안전하지 않으므로, 필요할 경우 외부에서 동기화 한다.
4. 복사본에 fail-safe iterator(장애 발생시 작업을 중단하지 않음)를 사용하여 컬렉션을 순회할 때, 컬렉션이 수정되어도 ConcurrentModificationException이 발생하지 않는다.
EnumSet 사용하기
// enum 선언
public enum Color {
RED, YELLOW, GREEN, BLUE, BLACK, WHITE
}
// allOf()를 사용하여 모든 요소를 포함하는 EnumSet 생성
EnumSet<Color> set = EnumSet.allOf(Color.class);
// noneOf()를 사용하여 빈 Color 컬렉션을 갖는 EnumSet 생성
EnumSet<Color> set = EnumSet.noneOf(Color.class);
// of()를 사용하여 들어갈 요소를 직접 입력하여 EnumSet을 생성
EnumSet<Color> set = EnumSet.of(Color.YELLOW, Color.BLUE;
// complementOf()를 사용하여 원하는 요소를 제거하고 EnumSet 생성
EnumSet<Color> set = EnumSet.complementOf(EnumSet.of(Color.BLACK,Color.BLUE));
// copyOf()를 사용하여 다른 EnumSet의 모든 요소를 복사하여 EnumSet 생성
EnumSet.copyOf(EnumSet.of(Color.BLACK, Color.WHITE));
// add()를 사용하여 EnumSet에 요소 추가
EnumSet<Color> set = EnumSet.of(Color.YELLOW, Color.BLUE;
set.add(Color.RED);
// contains()를 사용하여 특정 요소가 EnumSet()에 포함되어 있는지 확인
EnumSet<Color> set = EnumSet.of(Color.YELLOW, Color.BLUE);
set.add(Color.RED);
boolean isContain = set.contains(Color.RED);
if(isContain)
System.out.println("빨간색 포함");
// 출력 결과
// 빨간색 포함
// remove()를 사용하여 EnumSet에서 특정 요소 제거
set.remove(Color.RED);
ref {
http://www.tcpschool.com/java/java_api_enum
https://techblog.woowahan.com/2527/
}
'Programming > Java' 카테고리의 다른 글
[JAVA] I/O (0) | 2022.04.05 |
---|---|
[JAVA] Annotation (0) | 2022.03.28 |
[JAVA]멀티쓰레드 프로그래밍 (0) | 2022.03.14 |
[JAVA] 예외 처리 (0) | 2022.03.04 |
[JAVA]인터페이스 (0) | 2022.02.28 |
댓글