[아이템 20] 추상 클래스보다는 인터페이스를 우선하라
IT 개발/개념 정리
2022. 5. 26. 21:58
- 자바 8부터 인터페이스도 디폴트 메서드(default method)를 제공할 수 있게 되었다.(https://docs.oracle.com/javase/specs/jls/se17/html/jls-9.html#jls-9.4.3)
- 인터페이스는 믹스인(mixin)정의에 안성맞춤이다. - 믹스인 : 클래스의 주된 목적 외에 특정 선택적 기능을 제공(Comparable 자신을 구현한 클래스의 인스턴스들끼리 순서를 정할 수 있다.)
- 인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다. 거대한 클래스 계층구조에는 공통 기능을 정의해놓은 타입이 없으니, 자칫 매개변수 타입만 다른 메서드들을 수없이 많이 가진 거대한 클래스를 낳을 수 있다.
- 래퍼 클래스 컴포지션(아이템 18)과 함께 사용하면 인터페이스는 기능을 향상시키는 안전하고 강력한 수단이 된다.
- 인터페이스 + 추상 골격 구현 클래스 함께 제공하는 템플릿 메서드 패턴은 골격 구현을 확장하는 것으로 인터페이스를 구현하는데 필요한 일을 모두 할 수 있다.
static List<Integer> intArrayAsList(int[] a) {
Objects.requireNonNull(a);
//다이아몬드 연산자를 이렇게 사용하는 건 자바 9부터 가능하다.
// 더 낮은 버전을 사용한다면 <Integer>로 수정하자.
return new AbstractList<Integer>() {
@Override
public Integer get(int index) {
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;
}
};
}
위 코드는 골격 구현의 적합한 예시
골격 구현 작성 방법
- 인터페이스에서 다른 메서드 구현에 사용되는 기반 메서드(->추상메서드)를 선정
- 기반 메서드를 사용해 직접 구현할 수 있는 메서드를 디폴트 메서드로 제공
- 기반, 디폴트 메서드가 아닌 대상을 골격 구현 클래스에 작성
인터페이스의 속성
- 인스턴스 필드를 가질 수 없다.
- public이 아닌 정적 멤버도 가질 수 없다.
- * private 정적 메서드는 예외로 가질 수 있다.
- 작성하지 않은 인터페이스에는 디폴트 메서드를 추가할 수 없다.
반응형
'IT 개발 > 개념 정리' 카테고리의 다른 글
[아이템 22] 인터페이스는 타입을 정의하는 용도로만 사용하라 (0) | 2022.05.26 |
---|---|
[아이템 21] 인터페이스는 구현하는 쪽을 생각해 설계하라 (0) | 2022.05.26 |
[아이템 19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 (0) | 2022.05.21 |
[아이템 18] 상속보다는 컴포지션을 사용하라 (0) | 2022.05.14 |
[아이템 17] 변경 가능성을 최소화하라 (0) | 2022.05.14 |