java enum이란

enum이란

  • enum은 우리나라말로 열거 타입이라 말하며, 자바의 참조타입 중 하나이다.
  • 열거는 몇 가지 한정된 필드값을 나열한 것으로 그 필드값을 상수(enumeration constant)라 부른다. 상수는 변하지 않는 값을 의미한다.
  • enum은 일정 조건에서 기대되거나 한정되는 값을 미리 나열하고 변하지 않도록 고정하며 필요할 때 꺼내쓰기 위한 용도로 사용한다.
  • 같은 상수는 언제나 동일함을 보장한다.

enum의 정의 및 호출

public enum Season {
    SPRING, SUMMER, AUTUMN, WINDER
}

public enum MyStatus {
    WORKING,
    STUDYING,
    TAKING_A_REST,
    TAKING_A_BATH,
    HAVING_LUNCH,
    WORKING_OUT,
    DRIVING
}
  • enum의 상수는 대문자로 표기한다. 띄어쓰기가 필요할 경우 카멜표기법을 대신하여 언더바(_)를 사용한다.

enum의 상수는 모두 인스턴스로서 힙에 저장된다.

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER;

    Season() {
        System.out.println("생성자 호출 : "+this.toString());
    }
}

public void static main(String[] args){
    Season january = Season.WINTER;
}

결과: 생성자 호출 : SPRING 생성자 호출 : SUMMER 생성자 호출 : AUTUMN 생성자 호출 : WINTER

  • enum은 아래의 방식으로 객체를 생성한다.
    • Season 클래스 호출
    • 각 상수는 heap 영역에 객체를 생성.
    • 상수인 SPRING은 실제 객체가 생성(new)된 주소를 가리킴
  • 그러므로 같은 상수를 동등연산자로 비교하면 true로 응답한다.
Season january = Season.WINTER;
Season now = Season.WINTER;
boolean vali = now == january;
System.out.println("1월의 계절은 : "+january);
System.out.println("지금의 계절은 : "+now);
System.out.println("1월의 계절은 지금과 같나요? : "+vali);

결과: 1월의 계절은 : WINTER 지금의 계절은 : WINTER 1월의 계절은 지금과 같나요? : true

java.lang.Enum 클래스와 메서드

  • 모든 enum 타입은 Enum 클래스를 상속하도록 되어 있다. 해당 클래스가 제공하는 메서드는 아래와 같다.
  • enum은 미리 정의된 메서드 이외에 필요한 메서드를 추가적으로 구현할 수 있다.

ordinal(), valueOf()

  • ordinal()은 순서를 출력한다. 상수를 순서를 가진다.
  • valueOf()는 값을 출력한다.
  • 순서는 변하기 쉽고 통제하기 어렵다. 그러므로 개발에서는 사실상 valueOf()를 사용한다.
Season now = Season.valueOf("SPRING");
System.out.println(now); // SPRING
  • 이러한 컨셉은 스프링 JPA에서도 유사하다.
  • @Enumerated는 EnumType.ORDINAL, EnumType.STRING을 타입으로 가진다. 전자를 선택할 경우 해당 칼럼은 DB에서 숫자로 기록된다. DB가 엉킬 수 있으므로 반드시 후자를 사용한다.

values()

  • values는 enum 타입 모든 객체를 배열로 만든다.
Season[] seasons = Season.values();
for (Season season : seasons) {
    System.out.println(season);
}
  • 결과
SPRING
SUMMER
AUTUMN
WINTER