Enumeration Type에 대하여
학교에서 자바를 배웠지만, 수업에서 언급조차 되지 않아 이제서야 알게 된 기능이다.
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);
}
}
같은 방식을 사용하여 한글로 출력하는 메서드도 만들 수 있고,
생성자 또한 오버라이드가 가능하다.