출처: http://hyeonstorage.tistory.com/174
열거타입 enum
Java에서 열거 타입 enum을 정의할 수 있으며, 변수를 선언할 때 변수 타입으로 사용할 수 있다.
enum은 그 타입 변수의 모든 가능한 값을 열거함으로써 지정할 수 있다.
enum Season {winter, spring, summer, fall}
enum에서 나열할 수 있는 값들의 수는 제한이 없다.
Season time;
변수 time 은 가질 수 있는 값이 제한되어 Season의 4개 값 중 하나만 가질 수 있다.
그 외의 값을 가지게 되면 컴파일 오류가 발생한다.
time = Season.spring;
enum은 변수가 가질 수 있는 값의 수가 적을 때 꽤 도움이 된다.
예를 들어 학생이 받을 수 있는 학점을 나타낸다고 가정하면 다음과 같이 enum을 선언할 수 있다.
enum Grade {A, B, C, D, F}
Grade는 이 학점중의 하나의 값만 가질 수 있다.
* enum의 메쏘드
Static Methods | valueOf(String arg) | String 값을 enum에서 가져온다. 값이 없으면 Exception 발생 |
valueOf(Class<T> class, String arg) | 넘겨받은 class에서 String을 찾아, enum에서 가져온다. | |
values() | enum의 요소들을 순서대로 enum 타입의 배열로 리턴한다. ENUM$VALUES의 카피이므로, 너무 자주 호출하는 것은 좋지 않음. | |
Static 아닌 Methods | name() | 호출된 값의 이름을 String으로 리턴한다. |
ordinal() | 해당 값이 enum에 정의된 순서를 리턴한다 | |
compareTo(E o) | 이 enum과 지정된 객체의 순서를 비교한다. | |
equals(Object other) | 지정된 객체가 이 enum 정수와 같은 경우, true를 반환한다. |
* enum 활용 예제
public class enumTest { |
* 실행 결과
- enum City
위의 예제에서 City와 Season 두가지 enum 열거형 데이터를 선언했다.
기본적으로 City와 같은 enum을 많이 사용한다. 이렇게 제한된 값만을 처리할 때 enum을 처리 한다.
만약 City에 없는 Jeonju 와 같은 값을 호출하게 되면 java.lang.IllegalArgumentException이 발생하게 된다.
- enum Season
enum Season과 같이 기본적인 열거형 데이터 외에도, 연관된 데이터를 같이 선언할 수 있고, enum안에 함수도 선언할 수 있다.
각 데이터에 연관된 값을 가져오려면 위의 예제와 같이 함수를 선언하여 값을 처리 하고, get 함수를 선언해야 enum에서 가져올 수 있다.
이 방법도 잘 활용하면 유용하게 사용할 수 있다.
- enum은 한정된 데이터를 다루므로 조건문을 사용시 Switch 문을 사용하면 유용하게 사용할 수 있다.
* 암묵적으로 정의되는 메쏘드
enum City {Seoul, Busan, Daegu, Gwangju, Daejun}
이것은 아래와 같이 Compile이 된다. 참고하자
final class City extends Enum<City> { private City(String name, int ordinal) { super(name, ordinal); } public static final Status Seoul = new Status("Seoul", 0); public static final Status Busan = new Status("Busan", 1); public static final Status Deagu = new Status("Daegu", 2); public static final Status Gwangju = new Status("Gwangju", 3); public static final Status Daejun = new Status("Daejun", 4); private static final Status ENUM$VALUES[] = { Seoul, Busan, Daegu, Gwangju, Daejun }; } |
* enum의 특이사항
enum은 생성자가 private 이므로 new로 새로운 인스턴스를 만들 수 없다.
newInstance() 에 의해 인스턴스를 만들 수 없다. newInstance()를 호출 하면 InstantiationException이 발생한다.
clone()을 만들 수 없다.
Enum 클래스를 상속받고 있지만, clone() 메쏘드가 final로 지정되어 있어 사용하면 CloneNotSupportedException이 발생한다.
Serialize : enum의 값이 수정되어 순서가 변경되어도, ordinal 값이 다시 재 정의 된다.
'IT_Programming > Java' 카테고리의 다른 글
Java Reference와 GC (0) | 2015.02.16 |
---|---|
NullPointerException을 예방하는 방법 / [번역] 왜 Null이 나쁜가? (0) | 2014.11.10 |
[펌] Java 병렬 프로그래밍 Summary (0) | 2013.09.14 |
HTTP multipart/form-data raw 데이터는 어떤 형태일까? (0) | 2013.08.01 |
HTTP request 요청 시 Content-Type의 중요성 (0) | 2013.08.01 |