Q. interface default implementation 이란? abstract class 를 상속받는 것과 기본 구현을 들고 있는 interface 를 implement 하는것은 어떤 차이가 있나?
interface default implementation : 인터페이스는 추상 메서드만 제공이 되었는데, 자바 8부터 인터페이스도 디폴트 메서드를 통해 내용이 있는 메서드를 제공할 수 있게 되었다.
이렇게 함으로써 추상 클래스도 내용이있는 메서드를 제공할 수 있고, 인터페이스도 내용이 있는 메서드를 제공하게 된다.
둘이 어떤 차이가 있냐면
추상 클래스는 단일 상속만 가능하며, 추상클래스를 상속받은 클래스는 반드시 추상 클래스의 하위 클래스가 된다. 만약에 이미 추상클래스를 상속받았는데 또 다른 추상 클래스로 확장하길 원한다면, 그 추상 클래스는 계층 구조 상 최상위 부모 클래스가 되어야 한다. 반면에 인터페이스는 여러 개의 인터페이스를 손쉽게 구현할 수 있다. (class A implements B, C)
인터페이스는 믹스인 하기에 좋지만, 추상 클래스는 1번과 같은 이유로 단일 상속으로 인한 계층 구조 때문에 믹스인에 적합하지 않다. 믹스인이란 기존 클래스에 추가적인 기능을 추가하는 것인데 예를 들어 Comparable 인터페이스가 있다. Comparable 인터페이스를 구현하면 기존 클래스의 기능에 추가적으로 정렬을 하는 기능을 덧붙이는 것이다. 이처럼 클래스의 원래 기능에 추가적인 기능을 혼합한다고 해서 mixed in 믹스인이라고 부른다.
인터페이스가 무조건 좋아보이지만, 추상 클래스 대신에 인터페이스에 디폴트 메서드를 사용하는 것에도 단점이 있다.
인터페이스는 Object 클래스의 equals와 hashcode를 디폴트 메서드로 사용할 수 없다
인터페이스는 인스턴스 필드를 가질 수 없다
인터페이스는 public이 아닌 정적 멤버를 가질 수 없다
이같은 단점 때문에 디폴트 메서드를 사용할 수 없는 경우가 생긴다. 이럴 때 추상클래스를 “추상 골격 구현 클래스" ( skeletal implementation )로 만들어 인터페이스와 같이 사용한다. 인터페이스로는 타입을 정의하고, 메서드 구현이 필요한 부분은 추상 골격 구현 클래스에 구현하는 것이다. 이런 패턴을 템플릿 메서드 패턴이라고 한다.
( 이펙티브 자바 20 : 추상클래스보다는 인터페이스를 우선하라. 참고함 )
궁금하던 내용인데 정리 감사합니다