enum 타입(열거타입)


열거타입 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에서 가져온다. valueOf(String arg)는 내부적으로 자기 자신의 class를 가져오는 것이다.
values()
enum의 요소들을 순서대로 enum 타입의 배열로 리턴한다.
ENUM$VALUES의 카피이므로, 너무 자주 호출하는 것은 좋지 않음.
Static 아닌 Methods 
name() 
호출된 값의 이름을 String으로 리턴한다. 
ordinal()
해당 값이 enum에 정의된 순서를 리턴한다 
compareTo(E o)
이 enum과 지정된 객체의 순서를 비교한다. 지정된 객체보다 작은 경우 음의 정수, 동일하면 0, 크면 양의 정수를 반환한다.
equals(Object other) 
지정된 객체가 이 enum 정수와 같은 경우, true를 반환한다. 


* enum 활용 예제


public class enumTest {
 
    // City 열거형 객체 선언
    public enum City { Seoul, Busan, Daegu, Gwangju, Daejun }
 
    // Season 열겨형 객체 선언
    public enum Season{
     
        spring("March through May"),
        summer("June through August"),
        fall("September through November"),
        winter("December through February");
 
        private String span;
     
        // 열거 값에 (String) 값 span 에 대입
        Season(String months){
            span = months;
        }
     
        // span 값 반환
        public String getSpan(){
            return span;
        }
    }
 
 
    public static void main(String[] args){
     
        // City enum에서 "Seoul" 가져옴.
        City city1 = City.valueOf("Seoul");
     
        // name(), ordinal() 호출   < Seoul, 0 >
        System.out.println("city1 : " + city1.name());
        System.out.println("city1's order : " + city1.ordinal());
        System.out.println();
     
     
        // City enum에서 "Daegu" 가져옴.   City.valueof("Daegu")와 동일
        City city2 = City.Daegu;
     
        // name(), ordinal() 호출  < Deagu, 2 >
        System.out.println("city2 : " + city2.name());
        System.out.println("city2's order : " + city2.ordinal());
        System.out.println();
     
     
        // Seson.values()로 데이터를 배열로 가져온다.
        // 배열 순서대로 time 값과 time.getspan()을 호출한다.
        for(Season time : Season.values()){
            System.out.println(time + " " + time.getSpan());
        }
    }
}


* 실행 결과


- 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 값이 다시 재 정의 된다.


출처: http://hyeonstorage.tistory.com/174 [개발이 하고 싶어요]

댓글

이 블로그의 인기 게시물

MediaMetadataRetriever 사용하기

안드로이드 UI/CORE Library 파헤치기!!

안드로이드 책없이 배울수 있는 사이트 소개