본문 바로가기
Back-end

왜 enum(열거형)을 상속하지 못할까?

by 신재권 2023. 8. 13.

공부를 하다가 enum 상속을 막은 이유와 어떻게 컴파일러 단에서 막는지 궁금해서 찾아보았다.

Enum 클래스는 왜 상속이 안될까?

Java에서 enum 도 결국 클래스이다. 일반 클래스는 상속 받을 수 있다. 근데 왜 enum 클래스는 상속을 통해 확장하지 못할까?

왜 상속을 막은거고, 어떤 방식으로 막을까?

enum을 컴파일하면 Java 컴파일러를 통해 내부적으로 다음과 같이 된다.

  • 열거형을 추상 클래스 java.lang.Enum의 하위 클래스로 만든다. 즉, java.lang.Enum을 상속받는다.
  • 열거형을 final 클래스로 컴파일한다.

Java 에서는 클래스에 final 키워드를 붙이면, 상속이 불가능하다.

만약 상속이 가능하더라도, Enum 클래스를 최종적으로 상속하게 되는데, 이중 상속이 발생한다. 자바에서는 이중 상속이 불가능하다.

즉, 위와 같은 방식으로 Java에서 Enum의 상속을 막는다.

 

그러면 왜 상속을 막은걸까?

자바에서 enum은 상수의 집합을 나타내는 특별한 타입이고, 강한 타입 안전성을 보장한다.

만약 상속을 허용하면 유일성과 안정성이 깨질 수 있다.

즉, 상수의 집합을 나타내기 위해 만들었는데, 확장해서 새로운 값을 추가할 수 있다면 enum 은 필요가 없어진다. 따라서 불변하며, 타입 안전하게 enum을 설계하여 결과적으로 상속을 허용하지 않는다.

 

하지만 상속을 막을 뿐이지 구현은 막지 않는다. 즉 인터페이스를 구현하는 방식으로는 enum을 확장할 수 있다. 결국 모든 enum은 java.lang.Enum 을 잘 사용하면 하위 타입인 모든 enum을 매개변수로 받아 어떻게든 기능 확장이 가능하긴 하다.

 

인터페이스를 활용해 기능을 확장하는 방법은 이펙티브 자바에도 소개되어 있으니 궁금하면 참고하자.

 

참고자료

https://www.baeldung.com/java-extending-enums

'Back-end' 카테고리의 다른 글

static vs static final vs final In Java  (0) 2023.08.15
2023.08.13 TIL  (0) 2023.08.13
자바 static  (0) 2023.08.13
접근 지정자  (0) 2023.08.13
GC  (0) 2023.08.12