⭐ 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다.
public class Marine implements GroundAttackUnit, Comparable<Marine> {
private String name;
private int health;
@Override
public int compareTo(Marine o) {
return Integer.compare(health, o.getHealth());
}
/* 인터페이스 override 생략 */
...
/* getter, setter 생략 */
...
}
이처럼 자바 플랫폼에서도 Comparable, Iterable, AutoCloseable 인터페이스가 새로 추가됐을 때
표준 라이브러리의 수많은 기존 클래스가 이 인터페이스들을 구현한 채 릴리스 됐다.
⭐ 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다.
믹스인이란 클래스가 구현할 수 있는 타입으로, 믹스인을 구현한 클래스에 원래의 '주된 타입' 외에도
특정 선택적 행위를 제공한다고 선언하는 효과를 준다. 위 예제에서 Comparable
은 자신을 구현한 클래스의
인스턴스들끼리 순서를 정할 수 있다고 선언하는 믹스인 인터페이스이다.
⭐ 인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다.
public interface GroundAttackUnit extends AbleToWalk, Assailable {
void run();
}
현실에는 계층을 업격히 구분하기 어려운 개념도 있기에 이 정도의 유연성이 항상 필요하지는 않지만,
이렇게 만들어둔 인터페이스가 결정적인 도움을 줄 수도 있다.
인터페이스를 사용하지않고 위와같은 구조를 만들기 위해서는 가능한 조합의 경우의 수를 모두 각각
구현하는 상황이 생긴다. 이는 중복된 코드가 늘어나고 유지 보수가 더 어려워지는 결과를 초래할 수 있다.
속성이 n개라면 조합의 수는 2^n개나 된다. 흔히조합 폭발(combinatorial explosion)
이라 부르는 현상이다.
⭐ 핵심 정리
일반적으로 다중 구현용 타입으로는 인터페이스가 가장 적합하다. 복잡한 인터페이스라면 구현하는 수고를 덜어주는
골격 구현을 함께 제공하는 방법을 꼭 고려해보자. 골격 구현은 '가능한 한' 인터페이스의 디폴트 메서드로 제공하여
그 인터페이스를 구현한 모든곳에서 활용하도록 하는 것이 좋다. '가능한 한'이라고 한 이유는, 인터페이스에 걸려 있는
구현상의 제약 때문에 골격 구현을 추상 클래스로 제공하는 경우가 더 흔하기 때문이다.
참고 자료
Joshua Bloch, 『Effective Java 3/E』, 개앞맵시 옮김, 프로그래밍인사이트(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=
'Java' 카테고리의 다른 글
[Effective Java] 아이템 22. 인터페이스는 타입을 정의하는 용도로만 사용하라. (0) | 2023.03.20 |
---|---|
[Effective Java] 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라. (0) | 2022.05.24 |
[Effective Java] 아이템 18. 상속보다는 컴포지션을 사용하라. (0) | 2022.05.24 |
[Effective Java] 아이템 17. 변경 가능성을 최소화하라. (0) | 2022.05.24 |
[Effective Java] 아이템 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라. (0) | 2022.05.24 |