제 홈페이지의 모든 글은 anti-nhn license에 따릅니다.



java enum 정리 3 - java.lang.Enum 클래스와 enum의 실체

enum에 대한 마지막 글입니다.

지금까지 사용해온 예제 파일 Gender.java 는 다음과 같습니다.

public enum Gender {
    MALE, FEMALE ;
}

이것을 decompile 툴을 이용해서 decomplie해보면 다음과 같은 코드가 나옵니다.

public final class Gender extends Enum{

    private Gender(String s, int i){
        super(s, i);
    }

    public static Gender[] values(){
        Gender agender[];
        int i;
        Gender agender1[];
        System.arraycopy(agender = ENUM$VALUES, 0, agender1 = new Gender[i = agender.length], 0, i);
        return agender1;
    }

    public static Gender valueOf(String s){
        return (Gender)Enum.valueOf(enumtest/Gender, s);
    }

    public static final Gender MALE;
    public static final Gender FEMALE;
    private static final Gender ENUM$VALUES[];

    static {
        MALE = new Gender("MALE", 0);
        FEMALE = new Gender("FEMALE", 1);
        ENUM$VALUES = (new Gender[] {
            MALE, FEMALE 
        });
    }
}

이 코드는 컴파일은 되지 않습니다. java가 내부적으로 처리를 하는 것입니다.

일단 눈 여겨 보실 부분은 values(), valueOf() 메쏘드입니다. 자바가 컴파일시에 내부적으로 만들어내는 메쏘들입니다. 그 외에 지난 시간에 말씀드린 메쏘드들은 모두 java.lang.Enum 클래스에 정의되어 있습니다.

또 한가지는 우리가 사용하는 MALE이나 FEMALE과 같은 static 멤버 변수들은 전부 public static final로 정의됩니다. 일반적인 상수처럼 정의해버립니다. 그리고 그 리스트 전부를 ENUM$VALUES라는 변수에 배열로 저장하고 있습니다.



java.lang.Enum 클래스를 열어보면 다음과 같은 클래스 선언부를 가지고 있습니다.

public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable

enum이 compareTo 메쏘드가 있는 것은 상위 클래스인 Enum에서 Comparable을 구현했기 때문입니다. 또, Serializable을 구현해서 자유롭게 저장할 수 있습니다.

Enum에 정의된 몇 가지 메쏘드들을 살펴보겠습니다.

public final boolean equals(Object other) { 
    return this==other;
}

멤버 변수같은 거 비교할 필요없습니다. 그냥 자기자신인지를 비교하고 넘어갑니다. Object에 정의되어있는 것과 별로 다르지 않습니다만 final로 선언을 해버렸습니다.


protected final Object clone() throws CloneNotSupportedException {
 throw new CloneNotSupportedException();
}

clone은 지원하지 않습니다. final로 정의해서 어떤 enum도 clone을 지원하지 않도록 만들었습니다. reflection을 쓰더라도 clone을 못하게 막았습니다. enum의 경우는 singleton처럼 사용할 수 있도록 보장해주기 위한 것입니다.
clone을 지원하게 되면 Gender.MALE.equals(Gender.MALE.clone()) 은 true를 리턴해야겠지요. 그러나 위에서 본 바와 같이 equals는 인스턴스의 값을 비교하지 않습니다. 따라서 clone을 지원한다면 equals의 구현도 바뀌어야합니다.

by 삼실청년 | 2008/05/09 11:07 | 컴터질~ | 트랙백 | 핑백(1) | 덧글(6)

트랙백 주소 : http://iilii.egloos.com/tb/4346098
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Linked at 건실성실착실 3실 청년! : .. at 2008/05/09 11:18

... enum에 대해서 총 3부작으로 연재를 할려고 합니다.1 - 기본 개념2 - enum의 메쏘드3 - java.lang.Enum 클래스와 enum의 실체이 글은 그 첫번째로 enum에 대한 개념을 잡는 글입니다.enum은 비스무레한 원소들이 상수로 정의되는 클래스를 대신하기 위한 것입니다. java 1 ... more

Commented by 신병탁 at 2011/03/30 17:03
깔끔하게 정리 잘 하셨네요. 눈으로만 이해했는데 실제 사용할 때 다시 참조 해야겠군요.
Commented by 삼실청년 at 2011/04/15 19:38
예전에 정말 열심히 정리했던 글이네요.
저두 가끔 제가 쓴 거 참조합니다.ㅋㅋ 늙었는지 머리 속에 뭐가 남진 않네요..ㅜㅜ
Commented by 태양 at 2011/12/07 15:44
무슨말이지 ㅡㅡ
Commented by 김형석 at 2012/11/05 13:06
좋은 글 잘 보고 담아갑니다. 감사합니다^^
Commented by 삼실청년 at 2012/11/19 21:01
네이버만 아니면 어디든요!
Commented by 감사용 at 2018/05/28 13:50
감사합니다. 숙제로 머리가 터지는 중 덕분에 enum 이해가 좀 되는 것 같아요.

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶