Java Enum Type - 열거형
자바는 타입 안전 열거형 패턴을 편리하게 사용할 수 있도록 Enum Type 를 지원한다.
열거형은 앞서 배운 패턴에서 쉽게 사용하도록 언어에서 지원하고 있다.
Enumeration 은 일련의 정의된 상수들의 집합을 의미한다..
Grade.class
public enum Enum {
BRONZE,
SILVER,
GOLD,
}
- 열거형 정의는 class 대신 enum 사용
- 원하는 상수의 이름을 나열한다.
앞서 작성한 EnumGrade 정의한 클래스와 달라진 코드 길이를 볼 수 있다.
그리고 클래스인지 조회해보자
Enum 클래스 살펴보기
Main.class
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("class Info = " + Grade.BRONZE.getClass());
System.out.println("class Info = " + Grade.SILVER.getClass());
System.out.println("class Info = " + Grade.GOLD.getClass());
}
}
class Info = class Grade
class Info = class Grade
class Info = class Grade
- enum 은 클래스로 되어있다.
- 클래스로 되어 있기에 getClass() 메소드로 메타데이터를 조회할 수 있다.
- 자동으로 java.lang.Enum 에게 상속 받고 있다.
- 외부에서 임의로 새로 생성할 수 없다.
Enum 각각의 인스턴스
Main.class
public class Main {
public static void main(String[] args) throws Exception {
System.out.println("ref Info = " + refValue(Grade.BRONZE));
System.out.println("ref Info = " + refValue(Grade.SILVER));
System.out.println("ref Info = " + refValue(Grade.GOLD));
}
private static String refValue(Grade grade) {
return Integer.toHexString(System.IdentityHashCode(grade));
}
}
- 열거형 Grade 선언한 내부 상수들은 각각의 인스턴스를 갖고 있다.
- 열거형은 참조 값을 toString() 불려오지 못한다. 불려오려면 IdentityHashCode 로 호출하여 헥스 값으로 출력하는 메소드가 있어야 한다.
- IdentityHashCode 객체의 참조 값을 숫자로 반환
- toHexString 숫자를 16진수로 반환
열거형은 외부 생성 불가능
Grade g = new Grade(); // 생성 오류
오류 "enum classes may not be instantiated"
위의 코드 같이 생성 시도할 경우 오류가 발생한다.
import static - 팁과 트릭
열거형 사용 시 클래스명처럼 연결해서 표현해야했다.
...
System.out.println("ref Info = " + refValue(Grade.BRONZE));
System.out.println("ref Info = " + refValue(Grade.SILVER));
System.out.println("ref Info = " + refValue(Grade.GOLD));
공통 적으로 Grade 붙으므로 보기가 불편한데
이럴 떄 static import 사용 시 깔끔하게 표현할 수 있다.
import static Grade.*;
...
System.out.println("ref Info = " + refValue(BRONZE));
System.out.println("ref Info = " + refValue(SILVER));
System.out.println("ref Info = " + refValue(GOLD));
Enum 정리
타입 안전 열거형 패턴 장점
- 타입 안정성 항상
- 정해진 객체 사용으로 잘못된 값을 입력하는 문제를 해결할 수 있다.
- 데이터 일관성
- 정해진 객체 사용으로 데이터 일관성 보장
- 확장성
- 새로운 등급을 추가하고 싶을 때 새로운 상수만 추가하면 된다.