정리

인터페이스와 추상클래스의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상클래스의 하위 클래스가 되어야한다는 점이다.

기존클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다. 반면 새로운 추상클래스를 끼워넣는 것은 어려운게 일반적이다.

인터페이스는 mixin 정의에 안성맞춤이다. mixin : 클래스가 구현할 수 있는 타입으로, 믹스인을 구현한 클래스에 원래의 '주된타입' 외에도 특정 선택정 행위를 제공한다고 선언한다는 효과를 준다. 대상의 주된 기능에 선택적기능으로 혼합한다고 해서 mixin 이라고 한다.

인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다.

인터페이스는 기능을 향상시키는 안전하고 강력한 수단이 된다. 타입을 추상클래스로 정의해두면 그 타입에 기능을 추가하는 방법은 상속뿐이다. 상속해서 만든 클래스는 래퍼 클래스보다 활용도가 떨어지고 깨지기 쉽다.

인터페이스의 메서드 중 구현방법이 명확한것이 있다면, 그 구현을 디폴트 메서드로 제공해 프로그래머들의 일감을 덜어줄 수 있다. 단, 당신이 만들지 않은 인터페이스에는 디폴트메서드를 추가할 수 없다.

골격 구현 작성은 상대적으로 쉽다. 가장 먼저, 인터페이스를 잘 살펴 다른 메스드들의 구현에 사용되는 기반 메서드들을 선정한다. 이 기반 메서드들은 골격 구현에서는 추상 메서드가 될것이다. 그다음으로 기반 메서드들을 사용해 직접 구현할 수 있는 메서드를 모두 디폴트 메서드로 제공한다
단, equals와 hashcode 같은 object 의 메서드는 디폴트 메서드로 제공하면 안된다는 사실을 항상 유념하자

단순구현 (simple implementation)은 골격 구현의 작은 변종으로 AbstractMap.SimpleEntry 가 좋은 예이다.

정리

일반적으로 다중 구현용 타입으로는 인터페이스가 가장 적합하다. 복잡한 인터페이스라면 구현하는 수고를 덜어주는 골격구현을 함께 제공하는 방법을 꼭 고려해보자. 골격 구현은 '가능한 한 ' 인터페이스의 디폴트 메서드로 제공하여 그 인터페이스를 구현한 모든 곳에서 활용하도록 하는 것이 좋다. '가능한 한' 이라고 한 이유는 인터페이스에 걸려 있는 구현상의 제약 때문에 골격 구현을 추상 클래스로 제공하는 경우가 더 흔하기 때문이다.