사진찍는 프로그래머

Java 의 enum

개발/JAVA


작년부터 안드로이드 공부를 하면서 조금씩 자바(java) 를 익혀가고 있다.

C++ 이랑 비슷하면서도 참 많이 다른 게 자바인데 그 중에 특히 enum 은 그동안 C++ 에서 불편해 하던 것이

다 구현도 있어서 참 편하다

 

예전에 C++ 관련 쓴 글은 아래 링크 참조

 

기본적인 enum 선언이나 사용법은 자바나 C++ 이나 비슷하다   

public enum Fruit {
    Banana, Apple, Lemon, Tomato, Melon;
}

간단한 과일을 enum 으로 선언했는데, 각 enum 에 어떻게 값이 들어 가는 지는 아래 테스트 코드로 확인 가능

// 간단한enum 확인용테스트코드
for (Fruit f : Fruit.values())
{
    Log.d("log","ordinal: " + f.ordinal());    
    Log.d("log","name: " + f.name());
}

  

 

C++ 처럼 자바도 enum 항목들이 0,1,2,3… 순서대로 저장되고 추가적으로 enum.name() 멤버 함수를 통해 enum 이름도 구할 수 있다.

사실 자바의 enum 은 class 이기 때문에 C++ 보다 훨씬 많은 기능이 가능하고, 예전에 C++ 에서 복잡하게 해 보려 했던 일들(위 링크 참조)이 기본적으로 구현되어 있다.

위 enum 선언을 조금 고쳐서 각 과일에 적당한 한글 이름과 색상 정보를 추가해 보자 .

public enum Fruit {
    Banana("바나나", "노랑"),
    Apple("사과", "빨강"),
    Lemon("레몬", "노랑"),
    Tomato("토마토", "빨강"),
    Melon("멜론", "초록");
   

    private String m_sName;
    private String m_sColor;    

    // 이름, 색상에맞는새로운생성자마련
    Fruit(String sName, String sColor)
    {
        m_sName = sName;
        m_sColor = sColor;
    }

    // 과일색상가져오기함수
    public String getColor()
    {
        return m_sColor;
    }

    // 과일이름가져오기함수
    public String getName()
    {
        return m_sName;
    }
}


코드는 정말 간단 ^^;

enum 옆에 ("바나나", "노랑") 같은 2가지 인자가 추가되었는데,

이처럼 자바는 enum 의 각 항목에 추가적인 정보를 개수 상관없이 마음대로 추가할 수 있다.

물론, 2가지 정보를 추가했기 때문에 enum 생성자를 변경해야 한다

Fruit(String sName, String sColor)

 

이제 각 enum 별로 위 생성자대로 초기화가 진행 되어 각 항목별로 멤버 변수에 값이 할당 된다.

추가된 정보가 잘 들어 갔는지 확인하는 테스트 코드.

// 테스트코드
for (Fruit f : Fruit.values())
{ 
    Log.d(
"log","ordinal: " + f.ordinal());
    Log.d("log","name: " + f.name());            
    Log.d("log","한글이름: " + f.getName());
    Log.d("log","색상: " + f.getColor());
}

위 코드처럼 실행하면 아래 그림처럼, enum 의 각 항목 별로 순서, 원래 이름, 한글 이름, 색상까지 잘 나온다.


자바 enum 의 이러한 확장 기능을 잘 이용하면

데이터를 구분 짓는 ID 와 그 ID 와 연관된 추가적인 정보를 잘 관리 할 수 있어 정보를 체계적으로 다루는 데 아주 용이하다

(물론, 구조체나 클래스로 얼마든지 만들 수 있지만, 기본적으로 언어에서 제공한다는 것은 그만큼 사용하기 편하다는 뜻임)

 

 

'개발 > JAVA' 카테고리의 다른 글

Java 의 enum  (0) 2012.08.01