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 강제로 상속된다.
- 열거형은 다른 클래스를 상속 받을 수 없다.
- 열거형은 인터페이스 구현할 수 있다.
- 열거형 추상 메소드를 선언 및 구현할 수 있다.
- 익명 클래스 방식으로 사용한다.