NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    Java 6. Enum 형식.

    페이지 정보

    본문

    안녕하세요. 소심비형입니다. 오늘은 간단하게 열거형에 대해서 알아보도록 하겠습니다. 다른 여러 자료들이 워낙 잘되어 있다보니, 여기에서 자세히 설명하기보다는 이런 기능도 있다는것 정도만 확인하고 넘어가겠습니다. 구글에서 "Java enum"으로 검색해보면 수많은 자료들이 나옵니다. C#의 경우에는 처음부터 enum type(열거형)이 존재 했었지만, Java는 JDK 1.5부터 지원하기 시작했습니다. C#은 C, C++과 Java의 장점을 모두 흡수했기 때문에 처음부터 enum이 포함되게 되었습니다.

     

    Java의 enum은 C#과는 많은 부분이 다릅니다. C#은 클래스의 안과 밖에 모두 정의할 수 있지만 Java는 클래스 내부에는 정의할 수 없습니다. 아래 예제는 가장 간단한 enum의 사용예입니다.

    package JavaType;
     
    enum DialogResult {
        YES, NO, CANCEL, CONFIRM, OK
    }
     
    public class EnumTest {
        public static void main(String[] args) {
            System.out.println(DialogResult.YES);
            System.out.println(DialogResult.NO);
            System.out.println(DialogResult.CANCEL);
            System.out.println(DialogResult.CONFIRM);
            System.out.println(DialogResult.OK);
        }
    }

     

     

    C#은 enum의 항목에 자동으로 정수형 상수가 할당됩니다. 그렇기 때문에 열거형의 요소를 정수로 캐스팅할 수 있죠. 하지만, 자바에서는 다른 방법을 택할 수 있습니다. 자바의 enum은 생성자와 인터페이스 및 추상메서드도 정의할 수 있습니다. 어떻게 보면 더 좋다고 할수도 있죠^^; 가끔 C#의 enum을 사용하다 보면 무언가 부족함을 느끼곤 하거든요. 이 부분은 개발자들 사이에 논쟁거리이기도 합니다. C#의 경우에는 단순한 이름을 열거하는 상수역할에 충실하게 구현되어 있죠. 따라서 쉽고 빠르게 활용할 수 있습니다. 반면에 Java는 정의되는 열거형이 명명된 인스턴스와 같이 동작합니다. 그렇기에 접근성이 떨어지고 어려운 부분이 있지만 추가로 구현하는 방법을 택할때는 자바가 훨씬 우수하다고 볼 수 있습니다.

    아래는 결과 화면입니다.

    owwuDa5.png

     

     

    좀 더 일반적인 예를 보면 다음과 같습니다. Java와 C# 모두 흔히 사용하는 방법입니다. 물론 아래의 swith~case문 대신 if~else문을 사용해도 되죠. 더 직관적인 문법을 사용하면 됩니다.

    package JavaType;
     
    enum DialogResult {
        YES, NO, CANCEL, CONFIRM, OK
    }
     
    public class EnumTest {
        public static void main(String[] args) {
            DialogResult result = DialogResult.CONFIRM;
            
            switch (result) {
            case CONFIRM:
                System.out.printf("You have to %s.", DialogResult.CONFIRM);
                break;
            case CANCEL:
                System.out.printf("You have to %s.", DialogResult.CANCEL);
                break;
            case OK:
                System.out.printf("You have to %s.", DialogResult.OK);
                break;
            }
        }
    }

     

     

    결과는 여러분이 예상하는 그대로 나옵니다.

    vJYx3ac.png

     

     

    enum의 각 열거형에 속성을 지정할 수 있습니다. 이 기능이 정말 막강한데 아쉽게도 C#에서는 이 기능을 자바와 유사하게 흉내내려면 고급 기술인 리플렉션까지 가야합니다-_-; 못할건 없죠^^; 아래 코드는 국가를 나타내며 해당 국가의 이름과 면적이라는 속성까지 함께 표현할 수 있도록 합니다.

    package JavaType;
     
    enum Nation {
        Korea("100,210km²"), America("9,857,000 km²"), China("9,597,000 km²");
        private String area;
     
        private Nation() {
        }
     
        private Nation(String area) {
            this.area = area;
        }
     
        public String getArea() {
            return this.area;
        }
    }
     
    public class EnumTest {
        public static void main(String[] args) {
            System.out.println(Nation.America);
            System.out.println(Nation.America.getArea());
        }
    }

     

     

    아래는 결과입니다.

    v5PWWK1.png

     

     

    위의 예에서 생성자를 프라이빗(private)으로 추가한 부분이 보입니다. 이것은 enum이 특수한 클래스로 정적 클래스이기 때문입니다. 그렇기 때문에 new로 생성할 수 없고 접근 제한자를 protected, default, public으로 지정할 수 없습니다. 이는 static class와 비슷합니다. 상수들은 컴파일타임에 모든 값이 할당되어야 합니다. 그렇기 때문에 형식 안전성도 보장될 수 있게 됩니다. 다만, 정적 클래스가 enum과 다른점은 생성자에 public을 사용할 수 있다는 점입니다. Java와 C#의 static에 대해서도 차이가 많이 나는데요. 이 부분은 나중에 하게될 정적 클래스부분에서 좀 더 자세하게 다루도록 하겠습니다.

     

    다음 시간에...

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.