데이터 중 몇 가지로 한정된 값만을 갖는 경우가 있다. 예를 들어 요일에 대한 데이터는 월, 화, 수, 목, 금, 토, 일 이라는 7개의 값만 갖고, 계절에 대한 데이터는 봄, 여름, 가을, 겨울 이라는 4개의 값만 가진다. 이와 같이 한정된 값만 갖는 타입을 열거 타입이라고 한다.
열거 타입은 한정된 값인 열거 상수 중에서 하나의 상수를 저장하는 타입이다. 아래는 월, 화, 수, 목, 금, 토, 일 이라는 7개의 값을 갖는 요일 데이터의 열거 타입 week 를 선언한 것이다.
public enum Week { <- 열거 타입 이름
MONDAY, <- 열거 상수
TUESDAY, <- 열거 상수
WEDNESDAY, <- 열거 상수
THURSDAY, <- 열거 상수
FRIDAY, <- 열거 상수
SATURDAY, <- 열거 상수
SUNDAY <- 열거 상수
}
여기서 Week 가 열거 타입이다. Week로 다음과 같이 변수를 선언할 수 있다.
Week today;
today 변수에 저장할 수 있는 것은 Week에 선언된 7개의 열거 상수 중 하나이다.
today = Week.FRIDAY;
열거 타입 선언
열거 타입을 선언하기 위해서는 먼저 열거 타입의 이름을 정하고 해당 이름으로 소스 파일(.java)을 생성해야 한다.
열거 타입 이름은 관례적으로 첫 글자를 대문자로하고 나머지는 소문자로 구성한다. 만약 여러 단어로 구성된 이름이라면 각 단어의 첫 글자는 대문자로 하는 것이 관례적이다.
아래는 열거 타입 소스 파일들의 이름이다.
Week.java
MemberGrade.java
ProductKind.java
소스 파일의 내용으로는 다음과 같이 열거 타입 선언이 온다. public enum 키워드는 열거 타입을 선언하기 위한 키워드이며, 반드시 소문자로 작성해야 한다. 이 때 열거 타입 이름은 소스 파일 이름과 대소문자가 모두 일치해야 한다.
public enum 열거타입이름{
...
}
열거 타입을 선언했다면 이제는 열거 상수를 선언한다. 열거 상수는 열거 타입의 값으로 사용되는데, 관례적으로 열거 상수는 모두 대문자로 작성한다.
public enum Week {MONDAY, TUESDAY, WEDNESDAY, THUSDAY, FRIDAY, SATURDAY, SUNDAY}
열거 타입 이름 열거 상수
만약 열거 상수가 여러 단어로 구성될 경우에는 단어 사이를 밑줄(_)로 연결하는 것이 관례적이다.
public enum LoginResult {LOGIN_SUCCESS, SOGIN_FAILD}
열거 타입 생성

열거 타입 변수
열거 타입을 선언 했다면 이제 열거 타입을 사용할 수 있다. 열거 타입도 하나의 타입이므로 변수를 선언하고 사용해야 한다.
아래는 열거 타입 변수를 선언하는 방식이다.
열거타입 변수;
예를 들어 열거 타입 Week로 변수를 선언하면 아래와 같다.
Week today;
Week reservationDay;
열거 타입 변수를 선언했다면 다음과 같이 열거 상수를 저장할 수 있다.
열거 상수는 단독적으로 사용할 수 없고 반드시 "열거타입.열거상수" 형태로 사용된다.
열거타입 변수 = 열거타입.열거상수;
예를 들어 today 열거 타입 변수에 열거 상수인 SUNDAY 를 저장하면 다음과 같다.
Week today = Week.SUNDAY;
열거 타입 변수는 null 값을 저장할 수 있는데 열거 타입도 참조 타입이기 때문이다.
Week birthday = null;
참조 타입 변수는 객체를 참조하는 변수이다. 따라서 열거 상수도 객체이다. 열거 상수는 열거 객체로 생성되고 열거 타입 변수 Week 의 경우 MONDAY 부터 SUNDAY 까지의 열거 상수는 총 7개의 Week 객체로 생성된다. 그리고 메소드 영역에서 생성된 열거 상수가 해당 Week 객체를 각각 참조하게 된다.
열거 타입 Week 와 날짜 정보를 알려주는 Calender 클래스를 사용해 오늘이 무슨 요일인지 알아보는 간단한 프로그램 만들기
// Calender 클래스는 java.util 패키지에 있으므로 import 가 필요하다.
import java.util.Calendar;
public class EnumWeekExample {
public static void main(String[] args) {
Week today = null;
Calendar calendar = Calendar.getInstance();
int week = calendar.get(Calendar.DAY_OF_WEEK);
switch (week){
case 1:
today = Week.SUNDAY;
break;
case 2:
today = Week.MONDAY;
break;
case 3:
today = Week.TUESDAY;
break;
case 4:
today = Week.WEDNESDAY;
break;
case 5:
today = Week.THURSDAY;
break;
case 6:
today = Week.FRIDAY;
break;
case 7:
today = Week.SATURDAY;
break;
}
System.out.println("오늘 요일 : " + today);
if(today == Week.SUNDAY){
System.out.println("쉬는날");
}else{
System.out.println("코딩하는날");
}
}
}