디폴트 메서드
업데이트:
디폴트 메서드
- 인터페이스에 정의가 가능하며 상속체들이 구현하지 않고 인터페이스에서 사용할 수 있다.
default void sort(Comparator<? super E> c){
Collections.sort(this, c);
}
List에 추가된 디폴트 메서드로 직접 sort를 호출 할 수 있다.
Comparator.naturalOrder()
- 자연순서(표준 알파벳 순서)로 요소를 정렬할수 있다.
List<Integer> numbers = Arrays.asList(3,4,7,2,5);
numbers.sort(Comparator.naturalOrder());
추상 클래스와 자바 8 인터페이스
- 둘다 추상 메서드와 바디를 포함하는 메서드를 정의할 수 있다.
- 클래스는 하나의 추상 클래스만 상속 받지만 인터페이스는 여러개를 상속받을 수 있다.
- 추상 클래스는 인스턴스 변수로 공통 상태를 가질 수 있지만 인터페이스는 인스턴스 변수를 가질 수 없다.
디폴트 메서드 활용 패턴
선택형 메서드
- 디폴트 메서드를 이용하면 기본 구현을 제공할 수 있어 인터페이스를 구현하는 클래스에서는 구현을 제공할 필요가 없다.
동작 다중 상속
- 기본에 불가능했던 동장 다중 상속 기능도 구현이 가능하다.
public Class ArrayList<E> extends AbstractList<E>
implements List<E>, RandonAccess, Cloneable, Serializable{
}
기능이 중복되지 않는 최소의 인터페이스
- 다중 상속으로 인해 하나의 클래스에서 각각의 조합들을(인터페이스) 상속 받을 수 있다.
- 인터페이스에 기능이 추가되더라도 디폴드 메소드를 통해 구현하면 구현체들에게 영향이 가지 않는다.
해석 규칙
상속 관계에 있는 인터페이스들이 같은 시그니처를 갖는 메소드가 있는경우
- 클래스나 슈퍼클래스에서 정의한 메서드가 디폴트 메서드보다 우선권을 갖는다.
- 1번 규칙 이외에는 서브 인터페이스가 우선이 된다. B가 A를 상속 받는다면 B가 우선이다.
- 디폴트 메서드의 우선순위가 결정되지 않은 경우에는 상속받는 클레스에서 명시적으로 디폴데 메서드를 오버라이드 해야 한다.
댓글남기기