열거형(Enum)
열거형(Enum, Enumeration Type) 이란 상수들을 모아둔 클래스이다. 서로 관련이 있는 값들을 묶어서 편하게 사용할 수 있도록 하는 것이 목적이다.
Enum의 생성
Enum은 별도로 생성하는 메뉴가 존재하며, 원하는 패키지에 Enum을 생성하면 된다.
다음과 같은 형태로 생성된다.
Enum의 특징
Enum은 다음의 특징을 가진다.
단순 열거형으로 사용할 경우 값을 부여하지 않아도 된다.
멤버 변수를 만들어 객체 형태로 사용할 수 있다. 단, 생성자를 구현해야 한다.
public 생성자를 가질 수 없으며, 기본 생성자는 private 이다.
데모 1 : 기본 형태의 Enum
Week EnumExample01 실행 결과
Copy public enum Week {
MONDAY ,
TUESDAY ,
WEDNESDAY ,
THURSDAY ,
FRIDAY ,
SATURDAY ,
SUNDAY
}
Copy public class EnumExample01 {
public static void main ( String [] args){
System . out . println ( Week . MONDAY );
System . out . println ( Week . MONDAY . name ());
System . out . println ( Week . MONDAY . ordinal ());
System . out . println ( Week . TUESDAY );
System . out . println ( Week . TUESDAY . name ());
System . out . println ( Week . TUESDAY . ordinal ());
System . out . println ( Week . WEDNESDAY );
System . out . println ( Week . WEDNESDAY . name ());
System . out . println ( Week . WEDNESDAY . ordinal ());
System . out . println ( Week . THURSDAY );
System . out . println ( Week . THURSDAY . name ());
System . out . println ( Week . THURSDAY . ordinal ());
System . out . println ( Week . FRIDAY );
System . out . println ( Week . FRIDAY . name ());
System . out . println ( Week . FRIDAY . ordinal ());
System . out . println ( Week . SATURDAY );
System . out . println ( Week . SATURDAY . name ());
System . out . println ( Week . SATURDAY . ordinal ());
System . out . println ( Week . SUNDAY );
System . out . println ( Week . SUNDAY . name ());
System . out . println ( Week . SUNDAY . ordinal ());
}
}
Copy MONDAY
MONDAY
0
TUESDAY
TUESDAY
1
WEDNESDAY
WEDNESDAY
2
THURSDAY
THURSDAY
3
FRIDAY
FRIDAY
4
SATURDAY
SATURDAY
5
SUNDAY
SUNDAY
6
Week의 코드를 살펴보면, 세미콜론 없이 값을 열거했음을 확인할 수 있다.
Copy public enum Week {
MONDAY , TUESDAY , WEDNESDAY , THURSDAY , FRIDAY , SATURDAY , SUNDAY
}
값을 부여할 수도 있는데 다음 데모에서 살펴보기로 한다. 값을 부여하지 않으면 자동으로 변수명이 문자열 형태의 값으로 인식되며, 작성한 순서대로 0번부터 번호가 부여된다. 이름과 순서는 각각 name() , ordinal() 로 확인할 수 있다.
위 Enum은 다음 상수 형태로 표현이 가능하다
Week EnumExample02
Copy public class Week {
public static final String MONDAY = "MONDAY" ;
public static final String TUESDAY = "TUESDAY" ;
public static final String WEDNESDAY = "WEDNESDAY" ;
public static final String THURSDAY = "THURSDAY" ;
public static final String FRIDAY = "FRIDAY" ;
public static final String SATURDAY = "SATURDAY" ;
public static final String SUNDAY = "SUNDAY" ;
}
Copy public class EnumExample02 {
public static void main ( String [] args){
System . out . println ( Week . MONDAY );
System . out . println ( Week . TUESDAY );
System . out . println ( Week . WEDNESDAY );
System . out . println ( Week . THURSDAY );
System . out . println ( Week . FRIDAY );
System . out . println ( Week . SATURDAY );
System . out . println ( Week . SUNDAY );
}
}
데모 2 : 내부에 값을 가지는 Enum
Week EnumExample03 실행 결과
Copy public enum Week {
MONDAY( "월요일" ) ,
TUESDAY( "화요일" ) ,
WEDNESDAY( "수요일" ) ,
THURSDAY( "목요일" ) ,
FRIDAY( "금요일" ) ,
SATURDAY( "토요일" ) ,
SUNDAY( "일요일" );
private String value;
Week ( String value){
this . value = value;
}
public String getValue () {
return this . value ;
}
}
Copy public class EnumExample03 {
public static void main ( String [] args){
System . out . println ( Week . MONDAY . name ());
System . out . println ( Week . MONDAY . ordinal ());
System . out . println ( Week . MONDAY . getValue ());
System . out . println ( Week . TUESDAY . name ());
System . out . println ( Week . TUESDAY . ordinal ());
System . out . println ( Week . TUESDAY . getValue ());
System . out . println ( Week . WEDNESDAY . name ());
System . out . println ( Week . WEDNESDAY . ordinal ());
System . out . println ( Week . WEDNESDAY . getValue ());
System . out . println ( Week . THURSDAY . name ());
System . out . println ( Week . THURSDAY . ordinal ());
System . out . println ( Week . THURSDAY . getValue ());
System . out . println ( Week . FRIDAY . name ());
System . out . println ( Week . FRIDAY . ordinal ());
System . out . println ( Week . FRIDAY . getValue ());
System . out . println ( Week . SATURDAY . name ());
System . out . println ( Week . SATURDAY . ordinal ());
System . out . println ( Week . SATURDAY . getValue ());
System . out . println ( Week . SUNDAY . name ());
System . out . println ( Week . SUNDAY . ordinal ());
System . out . println ( Week . SUNDAY . getValue ());
}
}
Copy MONDAY
0
월요일
TUESDAY
1
화요일
WEDNESDAY
2
수요일
THURSDAY
3
목요일
FRIDAY
4
금요일
SATURDAY
5
토요일
SUNDAY
6
일요일
이름과 별개로 값을 가질 수 있으며, 이 때는 내부에 변수를 만들고 생성자를 구현해야 한다. 또한 열거형 상수 선언 시 ( ) 안에 생성자에 들어갈 데이터를 명시해야 한다. 변수는 여러 개 만들어서 여러 값을 보관시킬 수 있다. getValue()
는 임의의 getter 메소드이며, 데이터가 많다면 많이 만들어서 원하는 작업을 처리할 수 있다.
이 예제를 통해 단순 상수 선언보다 Enum은 더 많은 데이터와 기능을 묶어서 가질 수 있음을 알 수 있다.
데모 3 : valueOf() 의 활용
Holiday EnumExample04
Copy public enum Holiday {
NEWYEAR( "신정" , 1 , 1 ) ,
LABORDAY( "근로자의날" , 5 , 1 ) ,
CHILDRENSDAY( "어린이날" , 5 , 5 ) ,
MEMORIALDAY( "현충일" , 6 , 6 ) ,
INDEPENDENTDAY( "광복절" , 8 , 15 ) ,
CHRISTMAS( "크리스마스" , 12 , 25 );
private String name;
private int month , day;
Holiday ( String name , int month , int day){
this . name = name;
this . month = month;
this . day = day;
}
public String getName () {
return name;
}
public int getMonth () {
return month;
}
public int getDay () {
return day;
}
}
Copy public class EnumExample04 {
public static void main ( String [] args){
String name = "CHILDRENSDAY" ;
Holiday holiday = Holiday . valueOf (name);
System . out . println ( holiday . getName ());
System . out . println ( holiday . getMonth ());
System . out . println ( holiday . getDay ());
}
}
valueOf()
는 생성된 열거형 데이터 중에 해당하는 이름이 존재할 경우 객체를 반환하는 명령이다. 존재하지 않을 경우 java.lang.IllegalArgumentException
을 발생시킨다. 이를 통하여 기존의 상수에 비해 좀 더 다양한 처리를 구현할 수 있다.