[JAVA] 열거타입 enum[JAVA] 열거타입 enum

Posted at 2013.12.03 20:28 | Posted in == JAVA ==/JAVA



facebook에 글올리기



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


JAVA API DOC Enum



EnumTest.zip



이웃추가
facebook에 글올리기
  1. 궁금이
    내부적으로

    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 };

    }


    이렇게 된다는건 어떻게 아셨나요?
    그리고 valueOf, values 함수도 컴파일 시 자동으로 추가 된다고 하네요.

    혹시 http://stackoverflow.com/questions/1419835/understanding-enums-in-java

    여기 답변 중 하나를 참고하셔서 작성하신 건가요..?
    알게되신 방법에 대해서 알려주시면 감사하겠습니다.ㅎ 이런 코드를 많이 보셔서 알게되신거면 왜 그렇게 동작한다고 생각하셨는지 알려주시면 감사하겠습니다.
    • 2014.05.10 00:00 신고 [Edit/Del]
      안녕하세요
      문의주신 ENUM 의 내부적 동작 부분에 대해서는 저도 확실한 방법으로 확인한게 아니었네요..
      링크하신 URL 에서 참고한건 아니지만 다른곳에서 참고하여 작성하였습니다.
      실제로 ENUM의 동작 방식이 위의 모습과 같아서 ENUM이 이해되지 않을때 이해용으로 참고하는게 좋을거 같습니다.
      실제로 저렇게 동작 한다 라기보다 동작 방식을 이해하는 용도로 확인하시길 바랍니다. 확실하지 않은 내용을 올려 혼란을 줘서 죄송합니다.

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기