C/C++에서 존재했던 Enum이 이전 자바에 존재하지 않아서 아래와 같은 형태로 사용했었습니다.
1 2 3 4 5 6 | class Status { public static final int START = 0; public static final int STOP = 1; public static final int PAUSE = 2; public static final int RESUME = 3; } |
하지만 여기에는 몇가지 한계가 존재합니다.
- 타입에 대한 안전성을 보장하지 않습니다. START의 값이 0이 될 수도 있고 1이 될 수도 있고 무엇하나 START를 대표하는 값이 될 수 없습니다.
- 이름에 대한 값을 보장하지 않습니다. START를 출력하려고 한다면 0이 반환되어 이름대신 숫자를 출력하게 될 것 입니다.
- Namespace를 보장하지 않습니다.
결국 JDK1.5부터 Enum을 지원해주기 시작했습니다. 기본적인 형태는 C/C++에서와 같습니다.
1 2 3 | public enum Status { START, STOP, PAUSE, RESUME }; |
자바에서 Enum은 키워드이며, 클래스나 인터페이스와 같은 타입 입니다. 또한 static과 final이 내장되어 있어서 한번 정의된 값을 바꿀 수 없으며 int형 변수처럼 switch문에서 사용할 수 있습니다.
자바에서 Enum 사용시 아래와 같은 장점이 있습니다.
- 타입에 대한 안전성을 보장합니다. Enum 변수에 미리 정의된 상수를 제외한 다른 값을 할당 할 수 없습니다.
- Namespace를 보장합니다.
- Int형, char형 변수처럼 switch문에서 사용이 가능 합니다.
- 추가적인 상수를 추가하는게 매우 쉽고 단순 합니다.
자바 Enum의 중요한 점
- Namespace를 보장하기 때문에 Enum 변수에는 정의된 상수를 제외한 다른 값을 할당 할 수 없습니다.
123public enum Status { START, STOP, PAUSE, RESUME };Status status = Status.START;status = 0; // error! - Enum은 자바의 참자유형이기 때문에 클래스나 인터페이스 같이 생성자, 함수나 변수 등을 만들어 C/C++보다 더욱 파워풀하게 사용할 수 있습니다.
- 필요하다면 Enum 상수에 특정 값을 명시 할 수 있습니다. 다만 이 경우 생성자와 멤버변수를 작성해주어야 합니다. 생성자는 private으로 작성해주어야 합니다.
12345678910public enum Status {START(0), STOP(1), PAUSE(2), RESUME(3);private int value;private Status(int value) {value = value;}public int getValue() {return value;}}; - Enum 상수는 처음 정의된 후 변경할 수 없습니다.
1Status.START = Status.STOP; // error! - switch문에서 int형, char형 변수처럼 사용할 수 있습니다.
1234567891011Status status = Status.START;switch (status) {case START:break;case STOP:break;case PAUSE:break;case RESUME:break;} - Enum 변수를 비교 할 때는 “==”를 사용합니다.
1234Status status = Status.START;if (status == Status.START) {// ok} - 자바 컴파일러가 Enum 상수들에 대한 “values()” 함수를 제공합니다.
123for (Status status : Status.values()) {// work} - Enum은 함수를 오버라이드 하거나 생성 할 수 있습니다.
12345678910@Overridepublic String toString() {switch (this) {case START: return “Start”;case STOP: return “Stop”;case PAUSE: return “Pause”;case RESUME: return “Resume”;default: return super.toString();}} - Enum에 대한 EnumMap, EnumSet 컬렉션 클래스가 있어 더욱 다양하게 활용할 수 있습니다.
- Enum은 new를 사용하여 생성 할 수 없습니다.
- Enum 인스턴스는 코드 상에서 처음 호출되거나 참조 될 때 생성된다.
- Enum은 클래스처럼 인터페이스를 구현 할 수 있다.
1234567public enum Status implements Runnable {START, STOP, PAUSE, RESUME;@Overridepublic void run() {// work}} - Enum 안에 추상함수를 정의 할 수 있다.
123456789101112131415161718192021222324252627public enum Status {START {@Overridepublic string message() {return “Start”;}},STOP {@Overridepublic string message() {return “Stop”;}},PAUSE {@Overridepublic string message() {return “Pause”;}},Resume {@Overridepublic string message() {return “Resume”;}};public abstract String message();};
출처: http://javarevisited.blogspot.kr/2011/08/enum-in-java-example-tutorial.html
java에서 enum이 나오기 전을 예시로 들어주셔서 이해하는데 도움이 되었습니다. 감사합니다.!