final class처럼 동작한다.final static int 보다 더 객체지향적인 방식으로 코드를 작성할 수 있다.일반적인 상수는 단순히 값만을 가지지만, ENUM은 다양한 관점에서 상수를 표현할 수 있다.
enum OrderStatus {
PENDING, SHIPPED, DELIVERED, CANCELLED;
}
public class Order {
private OrderStatus status;
public Order() {
this.status = OrderStatus.PENDING;
}
public void shipOrder() {
if (status == OrderStatus.PENDING) {
this.status = OrderStatus.SHIPPED;
}
}
}
OrderStatus를 사용하면 String을 비교하는 것보다 타입 안정성이 보장된다.ENUM은 단순한 상수의 모음이 아니라, 객체처럼 동작하는 클래스이기 때문에 메서드도 가질 수 있다.
enum Direction {
NORTH {
@Override
public void describe() {
System.out.println("위쪽 방향입니다.");
}
},
SOUTH {
@Override
public void describe() {
System.out.println("아래쪽 방향입니다.");
}
};
public abstract void describe();
}
abstract 메서드를 선언하여 각 ENUM 값이 구현하도록 만들 수 있다.ENUM은 인터페이스도 구현할 수 있다. 이를 활용하면 ENUM을 더욱 유연하게 사용할 수 있다.
interface Printable {
void print();
}
enum Level implements Printable {
LOW {
public void print() { System.out.println("낮은 레벨"); }
},
HIGH {
public void print() { System.out.println("높은 레벨"); }
}
}
ENUM을 사용할 때 생성자를 정의하는 이유는?
⇒ ENUM은 클래스이기 때문. 객체를 생성 시 생성자가 있어야 한다. (필드가 있을 때)
ENUM을 활용하면 final static 상수보다 어떤 점이 더 좋은가?
⇒ 협업하는 사람들이 같은 생각을 할 수 있게 그룹핑 해준다.