스터디/이펙티브 자바

[Effective Java] Item38. 확장가능한 열거 타입이 필요하면 인터페이스

📝 작성 : 2022.06.26  ⏱ 수정 : 
728x90

열거 타입과 확장

열거 타입은 거의 모든 상황에서 타입 안전 열거 패턴보다 우수하지만 확장하는 것은 좋지 않음

  • 확장 타입의 원소는 기반 타입의 원소로 취급하지만 그 반대는 성립하지 않음
  • 기반 타입과 확장 타입의 원소 모두 순회할 방법도 마땅치 않음
  • 확장성을 높이려면 고려할 요소가 늘어남

확장 가능한 열거 타입

public interface Operation {
    double apply(double x, double y);
}
public enum BasicOperation implements Operation {
    PLUS("+") { public double apply(double x, double y) { return x + y; } },
    MINUS("-") { public double apply(double x, double y) { return x - y; } },
    TIMES("*") { public double apply(double x, double y) { return x * y; } },
    DIVIDE("/") { public double apply(double x, double y) { return x / y; } };

    private final String symbol;
    BasicOperation(String symbol) { this.symbol = symbol; }
    @Override public String toString() { return symbol; }
}
``
``` java
public enum ExtendedOperation implements Operation {
    EXP("^") { public double apply(double x, double y) { return Math.pow(x, y); } },
    REMAINDER("%") { public double apply(double x, double y) { return x % y; } };

    private final String symbol;
    ExtendedOperation(String symbol) { this.symbol = symbol; }
    @Override public String toString() { return symbol; }
}

열거 타입은 인터페이스를 구현할 수 있으므로 인터페이스를 구현한 Enum을 두 개 만들어 사용

확장 가능한 열거 타입의 문제

  • 열거 타입끼리 구현을 상속할 수 없음
  • 디폴트 구현을 이용해 인터페이스에 추가하는 방법은 사용 불가
  • 연산 기호를 저장하고 찾는 로직이 BasicOperation, ExtendedOperation 모두에 들어감
반응형