인터페이스: 다중 상속이 가능하다. 인터페이스를 구현했다면, 같은 타입으로 취급된다
추상클래스: 단일 상속만 가능하다. 구현체는 추상클래스의 하위 클래스가 된다
데코레이터 패턴(Decorator Pattern)
이라고 한다.컴포지션
(다른 클래스를 사용하는 패턴)과 전달
(인터페이스 구현체를 주입)을 합쳐 위임(delegation)
이라고 부른다.equals()
, hashCode()
와 같이 Object
에서 제공하는 메서드는 디폴트 메서드로 제공해선 안 된다.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 내부 클래스를 정의하고, 각 메서드 호출을 내부 클래스의 인스턴스에 전달하여 활용할 수도 있다. 이는 래퍼 클래스에서의 활용법과 비슷하다. 이 방식을 시뮬레이트한 다중 상속이라 하고, 다중 상속의 많은 장점을 제공하며 동시에 단점은 피하게 해준다