Java

[Effective Java] 아이템 20. 추상 클래스보다는 인터페이스를 우선하라.

quedevel 2022. 5. 24. 14:14
728x90
반응형

기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다.

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=

728x90
반응형