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