맞는데 왜 틀릴까..?

Java/Effective Java

[Effective Java] Item 38. 확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라

안도일 2023. 6. 29. 21:04
열거 패턴의 확장

 

  • 타입 안전 열거 패턴은 열거한 값들을 그대로 가져온 다음 값을 더 추가하여 다른 목적으로 쓸 수 있지만 열거 패턴은 그럴 수 없다.
  • 열거 타입을 확장하는 것은 좋지 않은 선택이지만 연산 코드 등 최소한의 쓰임새가 있다.

 

타입 안전 열거 패턴
타입 안전 열거 패턴은 열거 타입을 확장하여 더 많은 기능과 유연성을 제공하는 방식이다. 추가 정보를 가지는 필드와 메서드를 사용하여 상수에 대한 정보를 표현할 수 있고, 상수 집합을 제한하여 원하는 인스턴스만 생성할 수 있다. 이에 반해, 일반적인 열거 타입은 단순한 상수 값의 집합으로 사용되며, 추가 정보나 인스턴스 생성 제한 기능은 제공하지 않는다.

 

 

타입 안전 열거 패턴의 경우 ExtendedOperation 클래스를 정의하고 각 상수를 해당 클래스의 정적 필드로 선언한다.

추가적인 정보나 메서드를 포함할 수 있으며, 인스턴스 생성을 통해 사용할 수 있다.

 

 

인터페이스를 통한 열거 타입 확장

 

 

열거 타입이 임의의 인터페이스를 구현할 수 있으니,

연산 코드용 인터페이스를 정의하고 열거 타입이 이 인터페이스를 구현하게 하자

 

인터페이스

 

 

기본 구현체

 

 

열거 타입인 BasicOperation은 확장할 수 없지만 인터페이스인 Operation은 확장할 수 있으니 이 인터페이스를 연산의 타입으로 사용하자.

 

열거 타입을 확장한 구현체

 

 

apply가 인터페이스에 선언되어 있으니 열거 타입에 따로 추상 메서드로 선언하지 않아도 Operation 인터페이스를 사용하도록 작성되어 있다면 얼마든지 추가된 연산을 사용할 수 있다. 

 

 

Class 리터럴로 원소 순회

 

test 함수에 구현체의 class 리터럴을 넘겨 확장된 연산을 알리는 방법

 

test의 선언문은 Class 객체가 열거 타입인 동시에 Operation의 하위 타입이어야 한다는 뜻이다.

 

 

한정적 와일드카드 타입으로 원소 순회

 

class 객체 대신 한정적 와일드카드 타입을 넘기는 방법

 

 

 

결론

 

  • 열거 타입 자체는 확장할 수 없지만, 인터페이스와 그 인터페이스를 구현하는 기본 열거 타입을 함께 사용해 같은 효과를 낼 수 있다.