[JAVA] Enum이란? :: 잡다한 프로그래밍
반응형

0. 개요

Naming공부를 하다 Enum이 무엇인지 몰라서 정리해보는 계기가 되었다.

1. 정의

상수를 정의할 때 final static string 과 같은 방식으로 상수를 정의를한다. 하지만 이렇게 상수를 정의해서 코딩하는 경우 여러 문제가 발생함. 

따라서 이러한 문제점들을 보완하기 위해 자바 1.5버전부터 추가된 것이 바로 Enum

Enum은 열거형이라고 불리며, 서로 연관된 상수들의 집합을 의미한다.

 

2. Enum 이전의 방법들

#1) 상수 선언하여 사용하기

public class EnumExample {

    private final static int MONDAY = 1;
    private final static int TUESDAY = 2;
    private final static int WEDNESDAY = 3;
    private final static int THURSDAY = 4;
    private final static int FRIDAY = 5;
    private final static int SATURDAY = 6;
    private final static int SUNDAY = 7;

    public static void main(String[] args) {        

        int day = MONDAY;

        switch (day) {
        case MONDAY:
            System.out.println("월요일 입니다.");
            break;
        case TUESDAY:
            System.out.println("화요일 입니다.");
            break;
        case WEDNESDAY:
            System.out.println("수요일 입니다.");
            break;

            /*
             * ... 생략 ...
             */
        }
    }
}

다음과 같은 코드는 만약 Month에 대한 상수가 추가된다면 상수가 너무 많아지고, 만약 같은 이름으로 정의된 상수가 있다면 중복된 이름이라 오류가 발생한다.

 

#2) interface를 이용한 방법

interface DAY{  
    int MONDAY = 1;
    int TUESDAY = 2;
    int WEDNESDAY = 3;
    int THURSDAY = 4;
    int FRIDAY = 5;
    int SATURDAY = 6;
    int SUNDAY = 7;
}

interface MONTH{  
    int JANUARY = 1;
    int FEBRUARY = 2;
    int MARCH = 3;
    int APRIL = 4;
    int MAY =5;
    int JUNE = 6;
    int JULY = 7;
    int AUGUST = 8;
    int SEPTEMBER = 9;
    int OCTOBER = 10;
    int NOVEMBER = 11;
    int DECEMBER = 12;
}

public class EnumExample {

    public static void main(String[] args) {

        if(DAY.MONDAY == MONTH.JANUARY){ //이부분에러
            System.out.println("두 상수는 같습니다.");
        }       

        int day = DAY.MONDAY;

        switch (day) {
        case DAY.MONDAY:
            System.out.println("월요일 입니다.");
            break;
        case DAY.TUESDAY:
            System.out.println("화요일 입니다.");
            break;
        case DAY.WEDNESDAY:
            System.out.println("수요일 입니다.");
            break;

            /*
             * ... 생략 ...
             */
        }
    }
}

다음과 같이 인터페이스를 사용하게되면 이름이 같은 상수도 정의하여 사용할 수 있지만, if문을 보면 Day 의 Monday와 Month의 January부분이 같다고 인식하게되는 에러가 발생한다.

 

3. Enum의 사용이유

앞선 문제를 Enum을 사용하면 다음과 같이 해결할 수 있다. Enum을 사용하게 되면 static final의 반복이 사라져 가독성이 좋고 앞선 if문의 문제를 해결할 수 있다.

enum Day{  
    MONDAY,TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

enum Month{  
    JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, 
    AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;
}

public class EnumExample {

    public static void main(String[] args) {        

        Day day = Day.MONDAY;

        switch (day) {
        case MONDAY:
            System.out.println("월요일입니다.");
            break;
        case TUESDAY:
            System.out.println("화요일입니다.");
            break;
        case WEDNESDAY:
            System.out.println("수요일입니다.");
            break;

            /*
             * ... 생략 ...
             */
        }
    }
}

 

 

또한 다음과같이 이용할 수 있다.

enum Type {
    WALKING, RUNNING, TRACKING, HIKING
}
public class Shoes {
    public String name;
    public int size;
    public Type type;
     
    public static void main(String[] qrgs) {
        Shoes shoes = new Shoes();
         
        shoes.name = "아디다스";
        shoes.size = 270;
        shoes.type = Type.RUNNING;
         
        System.out.plintln("신발 이름 = " + shoes.name);
        System.out.plintln("신발 사이즈 = " + shoes.size);
        System.out.plintln("신발 종류 = " + shoes.type);
    }
}
반응형

+ Recent posts