클래스가 상수 만으로 만들어져 있을 경우에는 class
라고 선언하는 부분에 enum이라고 선언하면 "이 객체는 상수의 집합이다"라는 것을 명시적으로 나타낼 수 있다.
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 클래스 원소에 추가 속성 부여
enum의 각 열거형 상수에 추가 속성을 부여할 수 있다. 아래 코드와 같이 Left
, Right
을 나타내는 상수에 krName
속성을 추가한다.
public enum RoadSide
{
Left("왼쪽")
Right("오른쪽")
private String krName;
private RoadSide()
{}
private RoadSide(String krName)
{
this.krName = krName;
}
public String getKrName()
{
return krName;
}
}
getter method로 krName
속성을 필요할 때에 가져다 쓸 수 있다. 이처럼 메소드나 필드를 enum타입에 추가하면 enum 상수에 데이터를 연관시킬 수 있다.
enum 생성자는 왜 private인가?
enum 타입은 열거형을 의미하는 클래스이다. 따라서 일반 클래스처럼 생성자가 있어야 한다. 그런데 enum은 다른 클래스들과 달리 생성자의 접근 제어자를 private
만 허용한다. public
, protected
로 하게되면 아래와 같은 에러가 발생한다.
enum 타입은 고정된 상수들의 집합으로써 런타임이 아닌 컴파일타임에 모든 값을 알아야 한다. 즉, 다른 패키지나 클래스에서 enum타입에 접근해서 동적으로 값을 정해줄 수 없다. 따라서 컴파일 시에 타입안정성이 보장되며 생성자의 접근제어자를 private
으로 사용하는 것이다. 만약에 생성자가 private
이 아니라 public
이면 누구든지 instance
를 생성해 잘못된 값을 추가할 수 있다. 다시 말하지만 enum 타입은 고정된 상수들의
집합이다. 접근제어자를 private으로 설정했기 때문에 외부에서 접근 가능한 생성자가 없다. 그래서 enum 타입은 final과 다름이 없다. 그리고 enum 클래스 외부에서나 내부에서나 enum의 인스턴스를 생성할 수 없고 상속을 받을 수도 없다. 선언된 enum 상수만 존재할 뿐이다. private 제어자로 인해 인스턴스 생성을 제어하는 enum 특성은 싱글톤의 성질을 갖게된다.
public enum PowerSwitch {
ON("켜짐"),
OFF("꺼짐");
private String krName;
private PowerSwitch() {
// constructor
}
private PowerSwitch(String krName) {
this.krName = krName;
}
public String getKrName() {
return krName;
}
public PowerSwitch opposite() {
if (this == PowerSwitch.ON) {
return PowerSwitch.OFF;
} else {
return PowerSwitch.ON;
}
}
}
아래 코드를 보면 직접 powerSwitch
변수에 ON
상수를 할당한다. 그리고 Switch 변수로 opposite()메소드를 호출하면 OFF
상수를 반환한다. oppposite()메소드가 없다면 if
구문을 사용해 powerSwitch
변수에 있는 값을 확인해야 한다. 하지만 opposite()메소드를 호출해 한 번에 확인이 가능하다. 그리고 displayByPowerSwitch() 메소드로 ON 또는 OFF에 따른 작업을 수행한다. enum
덕분에 메인 메소드에서는 if문을 사용하지 않고 간단하게 ON/OFF 작업을 구현할 수 있다.
public class PowerSwitchMan {
public static void main(String[] args) {
PowerSwitch powerSwitch = PowerSwitch.ON;
displayByPowerSwitch(powerSwitch.opposite());
}
public static void displayByPowerSwitch(PowerSwitch powerSwitch) {
if (powerSwitch == PowerSwitch.ON) {
System.out.println("전원을 ON 합니다.");
} else {
System.out.println("전원을 OFF 합니다.");
}
}
}