Search
🙈

이펙티브 자바:: 아이템 38 <확장할 수 있는 열거 타입이 필요하면 인터페이스를 사용하라>

Intro::

이펙티브 자바 정리본입니다.

결론

열거 타입은 확장이 불가능합니다.
인터페이스와 그 인터페이스를 구현하는 기본 열거 타입을 사용해 같은 효과를 낼 수 있습니다.
API가 (기본 열거 타입을 직접 명시하지 않고) 인터페이스 기반으로 작성되었다면 기본 열거 타입의 인스턴스가 쓰이는 모든 곳을 새로 확장한 열거 타입의 인스턴스로 대체해 사용할 수 있습니다.
public interface Operation { double apply(double x, double y); }
Java
복사
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; } }
Java
복사

질문

기존 열거 타입에 상수를 추가하지 않고, 굳이 따로 확장하는 이유가 뭘까?

열거 타입을 확장해서 사용하는 이유는 코드의 유연성과 유지보수성을 높이기 위한 설계 선택입니다.
열거 타입은 상속이 불가능합니다.
기존 코드를 변경해야 한다면, 기존 코드 안정성이 떨어질 수 있습니다.
기능의 분리와 모듈화
책임이 명확해 집니다.
확장 가능성
새 연산을 추가할 때마다 기존 열거 타입에 추가한다면 모든 연산이 한 곳에 몰리기 때문에 복잡도가 증가합니다.
확장된 연산을 안전하게 다루기 위한 인터페이스 사용
특정 열거 타입에 의존하지 않도록 만들 수 있습니다.
비즈니스 요구사항의 변화
필요한 곳에서만 추가 연산을 사용할 수 있는 선택권을 제공

References::

이펙티브 자바 / 조슈아 블로크 지음 (프로그래밍 인사이트)