Java Enum - 지원하는 메소드

작성한 enum 은 클래스처럼 동작하므로 여러 메소드를 지원한다.
이처럼 메소드 지원하는 이유는 자바에서 "extends Enum" 상속받고 있기 때문이다.

그중 몇개를 살펴보자.


Enum 내부 상수 출력하기

public class Main {
    public static void main(String[] args) throws Exception {
        // 모든 ENUM 반환하기
        Grade[] values = Grade.values();
        System.out.println("ENUM: " + Arrays.toString(values));

        for (Grade grade : values) {
            System.out.println("NAME: " + grade.name() + ", ordinal: " + grade.ordinal());
        }
    }
}

ENUM: [BRONZE, SILVER, GOLD]
NAME: BRONZE, ordinal: 0
NAME: SILVER, ordinal: 1
NAME: GOLD, ordinal: 2

배열 내부를 출력하는 Arrays.toString 메소드로 Enum 상수를 꺼내 어떻게 출력하는지 살펴보았다.

ENUM 주요 메소드

  • values()
    • 상수를 배열로 반환한다.
  • name()
    • ENUM의 이름을 출력한다.
  • ordinal()
    • 상수의 선언 번호를 출력한다.

등급 문자열이 ENUM 으로 사용하기

String in = "SILVER";
Grade silver = Grade.valueOf(in);
System.out.println("SILVER: " + silver); // SILVER.toString() 호출한 것과 같다.

SILVER: SILVER

주요 메소드

  • valueOf(String name)
    • 주어진 이름과 일치하는 ENUM 상수로 반환한다.
  • toString()
    • ENUM 상수 이름을 문자열로 반환한다.
    • name() 유사하나, toString() 메소드는 오버라이드로 활용 할 수 있다.

문자열로 되어있는 것을 ENUM 활용하는 것이다. 단 ENUM 내부 상수에 이미 있는지 확인해야한다. 그렇지 않으면 에러가 발생한다.

💡
ENUM 객체에 없는 경우 ""Exception in thread "main" java.lang.IllegalArgumentException: No enum constant Grade.Silver"" 문구 출력

ordinal() 가급적 사용 지양하기

ordinal() 순서를 반환하는 메소드인데 사용하지 않는 것이 좋다. ordinal() 번호로 사용한 구현은 오류와 장애를 일으킬 가능성이 높다.

public enum Grade {
    BRONZE,
    SILVER,
    GOLD,
}

상단의 코드처럼 구성하였을 때 번호는 다음과 같다.

  • BRONZE = 0
  • SILVER = 1
  • GOLD =2

만약 상단에 신규 등급으로 PLATINUM 추가 시 순서를 알아보자

public enum Grade {
    PLATINUM,
    BRONZE,
    SILVER,
    GOLD,
}
  • PLATINUM = 0
  • BRONZE = 1
  • SILVER = 2
  • GOLD = 3

순서가 완전히 달라진다. ordinal() 데이터베이스로 매핑된 데이터는 모두 꼬여서 오류 및 의도치 않은 동작을 일으킬 수 있다.

장애 방지를 위해 데이터베이스에도 등급을 숫자가 아닌 문자열로 받도록 한다.

데이터베이스 예시

Grade 필드
SILVER
PLATINUM
BRONZE
GOLD

열거형 정리

  • 열거형은 java.lang.Enum 강제로 상속된다.
  • 열거형은 다른 클래스를 상속 받을 수 없다.
  • 열거형은 인터페이스 구현할 수 있다.
  • 열거형 추상 메소드를 선언 및 구현할 수 있다.
    • 익명 클래스 방식으로 사용한다.