인터페이스: 다중 상속이 가능하다. 인터페이스를 구현했다면, 같은 타입으로 취급된다

추상클래스: 단일 상속만 가능하다. 구현체는 추상클래스의 하위 클래스가 된다

인터페이스의 장점

  1. 믹스인
    1. 구현 클래스에 선택적 행위를 제공한다고 선언하는 효과를 준다.
  2. 계층이 없는 타입 프레임워크
    1. 인터페이스의 상속은 상속이라는 단어는 사용하지만, 클래스의 상속처럼 부모, 자식 계층이 존재하지 않는다.
      1. 부모 클래스의 생성자를 호출할 필요 없다.
      2. 부모 클래스의 구현 내용도 이어받지 않는다.
      3. 정의된 메서드들만 구현하면 된다.
  3. 레퍼 클래스
    1. 래퍼 클래스란 기존에 인터페이스를 구현한 클래스를 주입받아 기존 구현체에 부가기능을 손쉽게 더할 수 있는 클래스다.
      1. 이를 데코레이터 패턴(Decorator Pattern)이라고 한다.
      2. 컴포지션(다른 클래스를 사용하는 패턴)과 전달(인터페이스 구현체를 주입)을 합쳐 위임(delegation)이라고 부른다.
  4. 디폴트 메서드
    1. 인터페이스의 메서드 중 구현 방법이 명확한 메서드가 있다면, 디폴트 메서드를 활용할 수 있다.
      1. 단, equals()hashCode()와 같이 Object에서 제공하는 메서드는 디폴트 메서드로 제공해선 안 된다.
      2. 단, public이 아닌 정적 멤버도 가질 수 없다.

골격 구현(템플릿 메서드 패턴)

static List<Integer> intArrayAsList(int[] a) {
  Objects.requireNonNull(a);

  return new AbstractList<>() {
    @Override
    public Integer get(int i) {
      return a[i];
    }

    @Override
    public Integer set(int i, Integer val) {
      int oldVal = a[i];
      a[i] = val;
      return oldVal;
    }

    @Override
    public int size() {
      return a.length;
    }
  }
}

골격 구현 클래스는 추상 클래스처럼 구현을 도와주는 동시에 추상 클래스로 타입을 정의할 때 따라오는 심각한 제약에서는 자유롭다. 인터페이스 디폴트 메서드가 갖는 한계를 추상클래스를 이용해서 벗어난다.

인터페이스를 구현한 클래스에서 골격 구현을 확장한 private 내부 클래스를 정의하고, 각 메서드 호출을 내부 클래스의 인스턴스에 전달하여 활용할 수도 있다. 이는 래퍼 클래스에서의 활용법과 비슷하다. 이 방식을 시뮬레이트한 다중 상속이라 하고, 다중 상속의 많은 장점을 제공하며 동시에 단점은 피하게 해준다