glenn-syj / more-effective-java

이펙티브 자바를 읽으며 자바를 더 효율적으로 공부합니다
4 stars 5 forks source link

[MEJ-009] 열거 타입의 상속 불가에 대한 생각 #175

Closed FickleBoBo closed 1 month ago

FickleBoBo commented 1 month ago

Based on: #171 by @undeadtimo


아이템의 원리에 비하면 내용이 제법 어려웠다고 느껴졌는데 탐구하시느라 고생많으셨습니다.

@undeadtimo 님의 의문점 1번에 대해 저도 의문점이 생겨서 자료들을 열심히 찾아다녔는데 만족스러운 해답까지는 얻지 못했습니다. 일단 결론부터 말하자면 @undeadtimo 님과 비슷하게 생각하는데 열거 타입 자체가 하나의 온전한 상태를 갖고, 이를 참조만 하는 방식으로 사용하는 것을 권장하고 설계되었기 때문이지 않나 생각합니다. (열거 타입이 불변 클래스(item 17)인지는 아직 잘모르겠습니다)

일반적인 클래스의 다형성으로 생각해보면 열거 타입도 상속이 되는게 어색하지 않다는 생각이 들었는데, 이번 아이템의 인터페이스를 통해 기능을 확장하는 것을 보면 구현을 담당하는 각각의 열거 타입이 역할에 따라 추가만 되면서 여전히 읽기 전용으로 쓰이는 것 같아 보였습니다.

필자의 표현이 조금 난해하지만 클래스적인 관점(상하)이 아닌 열거 타입의 관점(수평)에서 확장을 말하려고 해서 이해하기 어려운게 아닌가 조심스럽게 생각합니다.


https://www.baeldung.com/java-extending-enums 조사를 하면서 읽었던 자료인데 열거 타입을 인터페이스로 확장하는 과정이 잘 나온거 같습니다!

undeadtimo commented 1 month ago

인터페이스를 통한 확장에 대해서도 제대로 감을 잡지 못하였는데, FickleBoBo님께서 공유해주신 자료를 참고하니 이해가 되었습니다.

public enum BasicStringOperation implements StringOperation {
    TRIM("Removing leading and trailing spaces."),
    TO_UPPER("Changing all characters into upper case."),
    REVERSE("Reversing the given string.");

    private String description;
    // constructor and getter override
}

public enum ExtendedStringOperation implements StringOperation {
    MD5_ENCODE("Encoding the given string using the MD5 algorithm."),
    BASE64_ENCODE("Encoding the given string using the BASE64 algorithm.");

    private String description;

    // constructor and getter override
}

위와 같은 두 개의 Class가 존재할 때, StringOperation 타입의 객체를 생성한다면, 기존의 BasicStringOperation 클래스의 것외에도 ExtendedStringOperation 클래스의 상수에도 접근할 수 있게 되는 것이군요!

다시 한 번 좋은 자료 공유 감사드립니다.

다만, 클래스적인 관점(상하)이 아닌 열거 타입의 관점(수평)에서 확장에 대해서는 저 또한 확신을 할 수 없기에, 추가적으로 조사하여 공유해보도록 하겠습니다.