// 확장 가능한 열거 타입을 위한 인터페이스
interface Animal {
void sound();
}
// 기본 열거 타입 구현
enum DefaultAnimal implements Animal {
DOG {
@Override
public void sound() {
System.out.println("Woof");
}
},
CAT {
@Override
public void sound() {
System.out.println("Meow");
}
},
BIRD {
@Override
public void sound() {
System.out.println("Tweet");
}
}
}
// 새로운 열거 타입을 추가하기 위해 Animal을 구현하는 열거 타입 정의
enum CustomAnimal implements Animal {
LION {
@Override
public void sound() {
System.out.println("Roar");
}
},
ELEPHANT {
@Override
public void sound() {
System.out.println("Trumpet");
}
}
}
public class Main {
public static void main(String[] args) {
// 기본 열거 타입 사용
DefaultAnimal.DOG.sound(); // 출력: Woof
DefaultAnimal.CAT.sound(); // 출력: Meow
// 새로운 열거 타입 사용
CustomAnimal.LION.sound(); // 출력: Roar
CustomAnimal.ELEPHANT.sound(); // 출력: Trumpet
}
}
이 예시 코드에서는 Animal 인터페이스를 정의하여 열거 타입이 구현하도록 하였다. 그리고 DefaultAnimal이라는 기본 열거 타입과 CustomAnimal이라는 새로운 열거 타입을 정의하고 각각의 상수에 대해 다른 동작을 구현하였다. 클라이언트는 Animal 인터페이스를 사용하여 두 열거 타입의 인스턴스를 다룰 수 있다.
핵심 정리 : 열거 타입 자체는 확장할 수 없지만, 인터페이스와 그 인터페이스를 구현하는 기본 열거타입을 함께 사용해 같은 효과를 낼 수 있다. 이렇게 하면 클라이언트는 이 인터페이스를 구현해 자신만의 열거 타입(혹은 다른 타입)을 만들 수 있다. 그리고 API가 (기본 열거 타입을 직접 명시하지 않고) 인터페이스 기반으로 작성되었다면 기본 열거 타입의 인스턴스가 쓰이는 모든 곳을 새로 확장한 열거 타입의 인스턴스를 대체해 사용
'이펙티브 자바' 카테고리의 다른 글
[이펙티브 자바] 아이템 40. @Override 애너테이션을 일관되게 사용하라 (0) | 2024.04.09 |
---|---|
[이펙티브 자바] 아이템 39. 명명 패턴보다 애너테이션을 사용하라 (0) | 2024.04.09 |
[이펙티브 자바] 아이템 37. ordinal 인덱싱 대신 EnumMap을 사용하라 (0) | 2024.04.06 |
[이펙티브 자바] 아이템 36. 비트 필드 대신 EnumSet을 사용하라 (0) | 2024.04.05 |
[이펙티브 자바] 아이템 35. ordinal 메서드 대신 인스턴스 필드를 사용하라 (0) | 2024.04.05 |