JAVA

Enumeration Type에 대하여

Droomii 2020. 1. 5. 17:54

학교에서 자바를 배웠지만, 수업에서 언급조차 되지 않아 이제서야 알게 된 기능이다.

 

Enumeration Type은 요일(월,화,수,목,금,토,일), 가위 바위 보, 사칙연산(더하기, 빼기, 곱하기, 나누기) 등과 같이,

 

출력되는 경우의 수를 모두 알고 있을 경우 하나의 목록으로 묶어 사용할 때 쓰인다.

 

필자는 여태까지 요일을 다룰 때 다음과 같이 월요일~일요일까지를 0~6까지의 정수로 표현하였다.

 

public class BeforeEnum {
    public static final String[] WEEKDAYS = {"월","화","수","목","금","토","일"};

    public static void main(String[] args) {

        // 요일을 가리키는 변수 - 목요일
        int weekDay = 3;

        System.out.printf("오늘은 %s요일 입니다.", WEEKDAYS[weekDay]);
    }

}

 

이와 같이 표기하면 각 숫자가 어떤 요일을 표현하는지 헷갈릴 수 있거나,

 

첫 번째 요일이 월요일인지, 일요일인지 모호해질 수도 있다.

 

더 나아가 0~6 이외의 값이 들어가면 오류가 생기는 문제도 있다.

 

이러한 모호성은 Enumeration Type을 통해 해소할 수 있다.

 

enum 타입 생성 방법은 다음과 같다.

public enum WeekDay {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

위와 같이 생성하여 WeekDay.MONDAY, WeekDay.TUESDAY ... 와 같이 요일 이름으로 접근하기 때문에,

 

숫자로 표시함으로써 생기는 모호성을 없애줄 수 있다.

 

WeekDay.MONDAY, WeekDay.TUESDAY ... 등으로 접근이 가능한 이유는,

 

요일들이 각자 하나의 객체로 생성되었기 때문이다.

 

위의 코드에서 실제로는 다음과 같은 일이 일어난다.

public enum WeekDay{
    public static final WeekDay MONDAY = new WeekDay();
    public static final WeekDay TUESDAY = new WeekDay();
    ...
    public static final WeekDay SUNDAY = new WeekDay();
}

 

이렇게 생성된 enum은 다음 코드와 같이 switch case 안에도 들어갈 수 있다.

 

public class Main {
    public static void main(String[] args) {
        WeekDay wd = WeekDay.SATURDAY;  // 토요일
        String wdString = "";

        switch (wd) {
        case MONDAY:
            wdString = "월";
            break;
        case TUESDAY:
            wdString = "화";
            break;
        case WEDNESDAY:
            wdString = "수";
            break;
        case THURSDAY:
            wdString = "목";
            break;
        case FRIDAY:
            wdString = "금";
            break;
        case SATURDAY:
            wdString = "토";
            break;
        case SUNDAY:
            wdString = "일";
            break;
        }
        // 오늘은 토요일 입니다.
        System.out.printf("오늘은 %s요일 입니다.\n", wdString);
        
        // today is SATURDAY
        System.out.printf("today is %s", wd);
    }
}

 위 코드의 두번째 출력에서 볼 수 있듯이,

 

enum타입에서 toString() 메서드를 사용하면 필드명 그대로를 출력한다.

 

이 메서드는 클래스처럼 오버라이드가 가능하다.

 

다음 코드는 toString()메서드를 오버라이드 하여 첫 글자만 대문자로 출력되게 한다.

 

public enum WeekDay {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY;

    @Override
    public String toString() {
        String name = super.toString();
        return name.substring(0,1) + name.substring(1).toLowerCase();
    }
    
    public static void main(String[] args) {

        // Today is Thursday.
        System.out.printf("Today is %s.", WeekDay.THURSDAY);
    }
}

같은 방식을 사용하여 한글로 출력하는 메서드도 만들 수 있고,

 

생성자 또한 오버라이드가 가능하다.