- Java의 Enum type은 constant value를 생성하고 사용하는 방법임. 어떤 유한한 값의 집합을 정의 함으로써, constant literal variable(String or int) 보다 더 type safe함
- CONVENTION : SCREAMING_SNAKE_CASE
- Enum은 싱글톤임!
[참고]
선언가장 일반적 용법생성자와 Final field 더하기Enum 생성 순서사용Enum 객체를 field를 기반으로 찾고 싶을 때 → static method 를 사용static blockEnum 메서드 재정의pre defined methodsname()ordinal()values()valueOf()
선언
가장 일반적 용법
public enum Element { H, HE, LI, BE, B, C, N, O, F, NE }
- 위의 선언으로 static, final한 enum 객체를 만든 것임
- 이 외에도, Enum type에 constructor와 field 그리고 method도 일반적인 클래스와 같이 더할 수 있음!
생성자와 Final field 더하기
public enum Element { H("Hydrogen"), HE("Helium"), // ... NE("Neon"); public final String label; private Element(String label) { this.label = label; } }
- 생성자를 만들 수는 있지만 호출할 수는 없음. Enum class는 new 로 생성하는 것이 막혀있기 때문에. Element.H 와 같은 식으로 클래스를 생성하면 내부적으로
“Hydrogen”
이라는 label을 전달하면서 생성이 됨
- field의 이름은
name
이 되면 안됨. Enum class 에는 미리 정의되어 있는 메서드가 있는데 그 중 name()이 존재하기 때문
- Enum의 field 가 꼭 final 이어야 하진 않지만, 거의 모든 경우에 Enum의 field가 바뀌는 것을 원치 않기 때문에 final로 주로 선언함
Enum 생성 순서
[ StackOverflow ] Enums - static and instance blocks
- enum instance 들은 Enum Type을 정의하면서 동시에 만들어짐
- → 그래서 어떠한 static block이라도 그 이후에 실행이 됨
- → instance block 정의 시, static block보다 먼저 실행이 되게 됨. 먼저 instance들을 만들어버리니까
사용
Enum 객체를 field를 기반으로 찾고 싶을 때 → static method 를 사용
public static Element valueOfLabel(String label) { for (Element e : values()) { if (e.label.equals(label)) { return e; } } return null; }
- 그러나 위와 같이 하면 계속 for loop를 돌아야 하기에 Caching 처리를 해주는 것도 가능함
public enum Element { private static final Map<String, Element> BY_LABEL = new HashMap<>(); static { for (Element e: values()) { BY_LABEL.put(e.label, e); } } public static Element valueOfLabel(String label) { return BY_LABEL.get(label); } }
static block
static block은 클래스에 적혀있는 순서대로 실행이 됨
Enum 메서드 재정의
- abstract 메서드를 통해 열거형 상수안에 각 상수별로 특정 메서드를 재정의 하도록 할 수 있음
public enum Color { RED("빨강",100) { @Override public int calc(int a, int b) { return a+b; } }, GREEN("초록",10) { @Override public int calc(int a, int b) { return a-b; } }, BLUE("파랑",30) { @Override public int calc(int a, int b) { return a*b; } }; private String koreName; private int pay; private Color(String koreName, int pay){ this.koreName = koreName; this.pay = pay; } public void colorInfo(){ System.out.println(koreName +"의 비용은 " + pay +"입니다."); } public abstract int calc( int a, int b ); }
pre defined methods
name()
- 열거 객체의 문자열 리턴
Season season = Season.SPRING; String name = season.name(); // SPRING
ordinal()
- enum instance의 인덱스를 반환함. Enum class에 선언된 순서.
values()
- enum array에 있는 모든 enum value들을 반환함
valueOf()
- Enum array에 있는 enum value를 String으로 가져오는 것
public enum Element { H, HE, LI, BE, B, C, N, O, F, NE } // Element.H.ordinal() // 0 Element.LI.ordinal() // 2 // Element[] elements = Element.values(); // H, HE, LI, .. // Element element = Element.valueOf("H"); // == Element.H