결론부터 말씀드리면, 자바에서는 열거형(Enum)을 확장할 수 없습니다. 자바의 모든 열거형은 컴파일 시점에 java.lang.Enum 클래스를 암묵적으로 상속합니다. 자바는 다중 상속을 지원하지 않기 때문에, enum 타입은 이미 java.lang.Enum을 상속하고 있는 시점에서 다른 클래스를 추가로 확장할 수 없습니다.
Enum 클래스의 선언 구조
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
// 공통 메서드들이 정의되어 있습니다.
}
열거형(Enum)이란?
- 열거형(Enum)은 Java 1.5 버전에서 도입된 특수한 데이터 타입입니다.
- 열거형은 상수들의 집합을 정의하는 데 사용됩니다. 단순한 숫자나 문자열로 표현하기 어려운, 미리 정해진 값 목록이 필요할 때 enum을 활용하면 좋습니다.
- 열거형의 요소들은 상수이며, 기본적으로 static이고 final입니다. 이러한 이유로 enum 필드의 이름은 대문자로 작성하는 것이 관례입니다.
- public 또는 protected 접근 제한자는 최상위(top-level) enum 선언에만 사용할 수 있으며, 중첩(nested) enum 선언에는 모든 접근 제한자를 사용할 수 있습니다.
확장은 불가능하지만 인터페이스 구현은 가능
클래스를 상속할 수는 없지만, 열거형은 인터페이스(interface)를 구현(implements)할 수 있습니다. 또한 아래 예제처럼 각 enum 상수별로 추상 메서드를 다르게 재정의하여, 마치 상속을 활용하는 것 같은 효과를 낼 수도 있습니다.
예제
enum Country {
US {
public String getCurrency() {
return "DOLLAR";
}
},
RUSSIA {
public String getCurrency() {
return "RUBLE";
}
},
INDIA {
public String getCurrency() {
return "RUPEE";
}
};
public abstract String getCurrency();
}
public class ListCurrencyTest {
public static void main(String[] args) {
for (Country country : Country.values()) {
System.out.println(country.name() + "의 통화는 " + country.getCurrency() + "입니다.");
}
}
}
실행 결과
US의 통화는 DOLLAR입니다. RUSSIA의 통화는 RUBLE입니다. INDIA의 통화는 RUPEE입니다.
정리
자바의 열거형은 설계 자체가 java.lang.Enum을 상속하도록 고정되어 있어 별도의 클래스 확장이 불가능합니다. 하지만 상수별 동작 재정의, 인터페이스 구현 등을 통해 충분히 유연하게 활용할 수 있으므로, 상속 대신 이러한 방식으로 열거형을 설계하는 것이 좋습니다.