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 내부 상수에 이미 있는지 확인해야한다. 그렇지 않으면 에러가 발생한다.
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 강제로 상속된다.
- 열거형은 다른 클래스를 상속 받을 수 없다.
- 열거형은 인터페이스 구현할 수 있다.
- 열거형 추상 메소드를 선언 및 구현할 수 있다.
- 익명 클래스 방식으로 사용한다.