본문 바로가기
Java

[JAVA]Enum 열거 타입

by HoneyIT 2023. 1. 17.

열거 타입 (Enumeration Type)

- 데이터 중 몇 가지로 한정된 값만 가지는 경우로 서로 연관된 상수의 집합을 저장하는 자료형

ex) 요일(월, 화, 수, 목, 금), 계절(봄, 여름, 가을, 겨울)


 

Enum 정의 방법

public enum 열거타입이름{ ... }

- 위처럼 열거 상수를 선언할 수 있고, 관례적으로 모두 대문자로 작성합니다.

 

public enum Weather{
    SPRING,
    SUMMER,
    FALL,
    WINTER
}

- 열거 상수가 여러 단어로 구성될 경우 단어 사이를 밑줄(_)로 연결합니다.


 

 

Enum 사용

Weather thisWeather = Weather.WINTER;

- 열거 타입도 하나의 데이터 타입이므로 변수를 선언하고 사용합니다.

- 선언된 변수에 열거 상수를 저장할 수 있습니다.


 

생성자와 메소드

enum Fruit {
	APPLE,
    ORANGE,
    BANANA
    
    Fruit(){
    	System.out.println("I am " + this);
    }
}

class Main {
	public static void main(String[] args) {
    	Fruit type = Fruit.APPLEl;
    }
}

- enum은 클래스이기 때문에 생성자를 가질 수 있습니다.

 

I am APPLE
I am ORANGE
I am BANANA

- 열거 타입이 정의된 열거 상수의 개수 만큼 생성자가 호출되는 것을 볼 수 있습니다.

- 열거 타입의 생성자는 private만 허용하기 때문에 주의해야 합니다.

 

enum Fruit {
	APPLE("RED"),
    ORANGE("orange"),
    BANANA("YELLOW");
    
    String color;
    
    Fruit(String color) {
    	this.color = color;
    }
}

- enum도 필드의 인스턴스 변수를 가질 수 있기 때문에 생성자의 매개변수를 통해서 값을 초기화 할 수 있습니다.


 

Enum이 제공하는 메소드

 

valueOf()

Weather thisWeather = Weather.valueOf("WINTER");

- thisWeather 변수에 열거 객체를 선언할 수 있습니다.

- 입력된 문자열에 해당하는 열거 객체가 없는 경우 java.lang.IllegalArgumentException: no enum constant 와 같은 에러가 발생할 수 있습니다.

 

values()

Weather[] weathers = Weather.values();

- 모든 열거 객체들을 배열로 만들어 리턴합니다.

- 배열의 인덱스는 열거 객체의 순번과 같습니다.

 

name()

Weather weather = Weather.WINTER;
String name = weather.name();

- 열거 객체가 가지고 있는 문자열을 리턴합니다.

- 열거 객체의 내부 문자열인 "WINTER"을 출력합니다.

 

ordinal()

Weather weather = Weather.WINTER;
int ordinal = today.ordinal();

- ordinal 변수에 순번이 3이 저장됩니다.

 

compareTo()

Weather weather1 = Weather.SPRING;
Weather weather2 = Weather.WINTER;
int result1 = weather1.compareTo(weather2);
int result2 = weather2.compareTo(weather1);

- 해당 객체를 기준으로 몇 번째에 위치하는지 비교합니다.

- result1은 -3, result2는 3이 출력됩니다.

- 단, ordinal 메서드를 사용하는 행위는 안티 패턴이 될 가능성이 높기 때문에 사용을 자제하는 것이 좋습니다.


 

 

EnumSet

- enum 클래스로 작동하기 위해 특화된 Set 컬렉션 (데이터를 중복 저장할 수 없고, 순서가 보장되지 않는 자료구조)입니다.

- EnumSet은 Set 인터페이스를 구현하고, AbstractSet을 상속합니다.

 

고려사항

  1. 열거형 값만 포함할 수 있으며, 모든 값은 동일한 열거형이어야 한다.
  2. null을 추가할 수 없다.
  3. 스레드에 안전하지 않으므로, 필요한 경우 외부에서 동기화한다.
  4. 복사본에 fail-safe iterator(장애 발생시 작업을 중단하지 않음) 를 사용하여 컬렉션을 순회할 때, 컬렉션이 수정되어도 ConcurrentModificationException이 발생하지 않는다.

EnumSet은 추상 클래스이며 인스턴스 생성을 위한 다양한 정적 팩토리 메서드가 정의되어있습니다.

JDK에서는 Regular, EnumSet, JumboEnumSet 2가지의 EnumSet 구현체를 제공한다.

 

 

EnumSet 사용

public enum Color {
	RED,
    YELLOW,
    GREEN,
    BLUE,
    BLACK,
    WHITE
}
EnumSet<Color> Set = EnumSet.allOf(Color.class);
set.forEach(System.out::println);

- Color의 모든 요소를 포함하는 EnumSet을 만들 수 있습니다.

 

결과

RED
YELLOW
GREEN
BLUE
BLACK
WHITE

 

 

noneOf()

EnumSet<Color> set = EnumSet.noneOf(Color.class);

- 빈 Color 컬렉션을 갖는 EnumSet을 만들 수 있습니다.

 

of()

EnumSet<Color> set = EnumSet.of(Color.YELLOW, Color.BLUE);

- 들어갈 요소를 직접 입력하여 EnumSet을 생성할 수 있습니다.

 

complementOf()

EnumSet <Color> set = EnumSet.complementOf(EnumSet.of(Color.BLACK, Color.BLUE));
set.forEach(System.out::println);

- 원하는 요소를 제거하고 EnumSet을 생성할 수 있습니다.

 

copyOf()

EnumSet.copyOf(EnumSet.of((Color.BLACK, Color.WHITE));

- 다른 EnumSet의 모든 요소를 복하사여 EnumSet을 만들 수 있습니다.

 

add()

EnumSet <Color> set = EnumSet.of(Color.YELLOW, Color.BLUE);
set.add(Color.RED);

- EnumSet에 요소를 추가할 수 있습니다.

 

contains()

EnumSet <Color> set = EnumSet.of(Color.YELLOW, Color.BLUE);
set.add(Color.RED);
boolean isContain = set.contains(Color.RED);

- 특정 요소가 EnumsSet에 포함되어 있는지 알 수 있습니다.

 

remove()

set.remove(Color.RED);

- EnumSet에서 특정 요소를 제거할 수 있습니다.

 

 

'Java' 카테고리의 다른 글

[Java] Lombok의 Builder Design Pattern  (0) 2024.07.25
[Java] Java 공백 제거  (0) 2022.07.28
객체지향 프로그래밍이란 무엇일까  (0) 2021.03.01
DTO/DAO  (0) 2020.08.10
Ajax  (2) 2020.08.01