JAVA Enum
Enum 의 탄생 배경을 먼저 알고 있어야 Enum 의 가치와 용도를 쉽게 이해할 수 있기 때문인지, 많은 다른 분들의 Enum 에 대해서 포스팅을 보면, Enum 의 탄생 배경을 곁들이고 있었다. 하지만 여기선 탄생 배경은 생략 하고, 현업에서 사용하기 적절한 Enum 구현 예제와 구문 작성시 특이점들에 대해서 작성 하고자 한다. 이미 많은 포스팅이 인터넷에 올라와 있기도 하고, Enum 에 관심을 가지고 있는 분들은 탄생 배경을 알고 있다는 생각되기 때문이다. 특이점에 대해서는 왜 그러하는지 아직 밝혀내지 못한 부분이 많으니 참고만 할것을 당부 드린다.
Enum 의 자료형
기본적으로 Enum 은 public static final (고정 상수) 이다. new 를 통한 instance 선언없이 모든 property 에 직접적으로 참조가 가능하며, 고정된 상수에도 유사한 정보를 갖고 있는 데이터들을 주욱 열거 하기에 적절하다.
먼저 Enum 을 적절하게 구현 한 예제를 본 후, 라인별 설명을 추가 하도록 하겠다.
개발시 빨리 가져다 쓰기 위해..
Enum 구현 예제
public enum Level {
// 상수이름(속성, 속성, 속성)
GOLD(3, "금", "30000"), SILVER(2, "은", "20000"), BASIC(1, "동", "10000");
// 멤버변수
private final int code; // 코드값
private final String knm; // 한글이름
private final String amount; // 금액
// 생성자 (미작성시 구문에러 발생. private 접근제어자만 사용 가능)
private Level(int code, String knm, String amount) {
this.code = code;
this.knm = knm;
this.amount = amount;
}
public static void main(String[] args) {
System.out.println(Level.GOLD.knm); // 결과 1. 금
System.out.println(Level.GOLD==Level.GOLD); // 결과 2. true
System.out.println(Level.GOLD.name()); // 결과 3. GOLD
}
}
일반 클래스 처럼 이해 하기에 무언가 이질감이 느껴지는 부분들이 있다.
Enum을 일반 클래스 작성하듯이 코딩 하다 보면 쉽게 써지지 않는데, 이유는 다음과 같은 특이점이 있기 때문이다.
Enum 의 특이점
1. 상수 선언부가 존재한다.
일반 클래스와 달리, 상수를 선언하는 부분이 있는데, 상수 이름만 작성해도 되는 방식이 있는 반면, 위의 Enum 구현 예제
처럼 변수들을 전달 하기 위해 메소드 호출 형식처럼 상수를 선언 할수 있다.
속성 없이 상수 이름만 열거하여 선언
// 상수 이름만 열거
GOLD, SILVER, BASIC
일반 상수 선언. 상수 이름만 작성하면 된다.
속성을 부여한 상수 선언
// 상수이름(속성, 속성, 속성)
GOLD(3, "금", "30000"), SILVER(2, "은", "20000"), BASIC(1, "동", "10000");
// 생성자 (미작성시 구문에러 발생. private 접근제어자만 사용 가능)
private Level(int code, String knm, String amount) {
}
속성을 부여한 상수 선언. 메소드 호출하듯이 작성하면 된다.
상수에 속성이 없는 경우는 생성자를 생략해도 되지만, 상수에 속성을 추가하해서 사용하려면 생성자도 이에 맞춰 인자를 받아 들일수 있도록 작성 해 주어야 한다. 단순히 상수 이름 만으로는 의미있는 정보를 만들어 내기 어려우므로, 보통은 두번째 선언 방법 (메소드 호출형식) 이 주로 사용된다.
#####2. 생성자는 private 으로만 선언이 가능 하며, 외부 에서는 new 를 이용한 초기화 가 불가능 하다. ### 정확한 근거는 찾지 못했지만, Enum 의 주 용도가 public static 한 상수들을 사용 하는것이 목적인 타입 이기 때문에 new inctance 가 불필요하여 막아준듯 하다. 그리고 이러한 상수들을 public static 을 직접 작성하면 구문 에러가 발생한다.
#####3. 멤버변수에 선언된 모든 변수를 외부에서 접근이 가능하다.###
분명 위의 Enum 구현 예제
에서 결과 1을 보면 Enum 의 멤버변수를 직접적으로 참조가 가능하다.
System.out.println(Level.GOLD.knm); // 결과 1. 금
멤버변수 knm 은 분명히 private 으로 선언되어 있지만 위와 같은 결과가 처리되는 원리는 아직 밝혀내지 못했다. 추후 근거를 알게되면 업데이트 하도록 하자.
몇가지 특이점들을 알아 봤지만 왜 그러하는지 근거를 밝혀내지 못했다.