코딩하는 털보

이펙티브 자바, 아이템 20. 추상 클래스보다는 인터페이스를 우선하라 본문

Book/이펙티브 자바

이펙티브 자바, 아이템 20. 추상 클래스보다는 인터페이스를 우선하라

이정인 2021. 9. 4. 18:58

이펙티브 자바, 아이템 20. 추상 클래스보다는 인터페이스를 우선하라

인터페이스를 우선해야 하는 이유

  • 추상 클래스를 구현하려면 추상 클래스를 상속해야 한다. 자바는 단일 상속만 지원하므로 이 방식은 새로운 타입을 정의하는 데 커다란 제약을 안게 된다.
  • 인터페이스는 기존 클래스에서 손쉽게 구현해넣을 수 있다.
  • 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다.
    mixin : 클래스가 구현할 수 있는 타입, 믹스인을 구현한 클래스에 원래의 '주된 타입'외에 특정 선택적 행위를 제공한다고 선언하는 효과를 준다. (ex Comparable, Serializable, ...)
    추상 클래스는 위에 나온 제약 때문에 믹스인을 정의할 수 없다.
  • 인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다.
    계층을 엄격히 구분하기 어려운 개념을 여러 인터페이스를 구현함으로써 해결할 수 있다.
    추상 클래스에서는 조합 폭발 현상이 발생한다.
  • 인터페이스를 래퍼 클래스와 함께 사용하면 기능을 향상시키는 안전하고 강력한 수단이 된다.
    상속해서 만든 클래스는 래퍼 클래스보다 활용도가 떨어지고 깨지기는 더 쉽다.
  • 디폴트 메서드를 사용할 수 있게 되었다.
    주의사항 : equals와 hashCode 같은 Object 메서드는 디폴트 메서드로 제공하면 안 된다.

템플릿 메서드 패턴
인터페이스와 추상 골격 구현 클래스를 함께 제공한다.
관례상 추상 골격 구현 클래스 이름은 "Abstract"+인터페이스이름 (ex AbstractCollection, AbstractSet, AbstractList, AbstractMap, ...)
인터페이스로는 타입을 정의하고 추상 클래스 또는 인터페이스인 골격 구현 클래스에서는 타입이 되는 인터페이스에 정의된 메서드를 구현한다.
단순히 골격 구현 클래스만 확장하면 인터페이스를 구현하는 일이 대부분 완료된다.
구조상 골격 구현을 확장하지 못하는 경우에는 인터페이스를 구현한 상태에서 골격 구현 클래스를 확장한 내부 클래스의 인스턴스에 메서드 호출을 전달한다(시뮬레이드한 다중 상속, simulated multiple inheritance). 다중 상속의 많은 장점을 제공하면서 단점은 피하게 해준다.
주의사항 : 골격 구현 클래스는 상속용 클래스로 가정되므로 설계 및 문서화 지침을 따라야 한다.

단순 구현
골격 구현의 작은 변종으로 추상 클래스가 아니다. 즉, 동작하는 가장 단순한 구현이다.
골격 구현 클래스와 다르게 그냥 그대로 쓸 수 있다.

Comments