디폴트 메서드

업데이트:

디폴트 메서드

  • 인터페이스에 정의가 가능하며 상속체들이 구현하지 않고 인터페이스에서 사용할 수 있다.
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 인터페이스

  1. 둘다 추상 메서드와 바디를 포함하는 메서드를 정의할 수 있다.
  2. 클래스는 하나의 추상 클래스만 상속 받지만 인터페이스는 여러개를 상속받을 수 있다.
  3. 추상 클래스는 인스턴스 변수로 공통 상태를 가질 수 있지만 인터페이스는 인스턴스 변수를 가질 수 없다.

디폴트 메서드 활용 패턴

선택형 메서드

  • 디폴트 메서드를 이용하면 기본 구현을 제공할 수 있어 인터페이스를 구현하는 클래스에서는 구현을 제공할 필요가 없다.

동작 다중 상속

  • 기본에 불가능했던 동장 다중 상속 기능도 구현이 가능하다.
public Class ArrayList<E> extends AbstractList<E>
	implements List<E>, RandonAccess, Cloneable, Serializable{

}

기능이 중복되지 않는 최소의 인터페이스

  • 다중 상속으로 인해 하나의 클래스에서 각각의 조합들을(인터페이스) 상속 받을 수 있다.
  • 인터페이스에 기능이 추가되더라도 디폴드 메소드를 통해 구현하면 구현체들에게 영향이 가지 않는다.

해석 규칙

상속 관계에 있는 인터페이스들이 같은 시그니처를 갖는 메소드가 있는경우

  1. 클래스나 슈퍼클래스에서 정의한 메서드가 디폴트 메서드보다 우선권을 갖는다.
  2. 1번 규칙 이외에는 서브 인터페이스가 우선이 된다. B가 A를 상속 받는다면 B가 우선이다.
  3. 디폴트 메서드의 우선순위가 결정되지 않은 경우에는 상속받는 클레스에서 명시적으로 디폴데 메서드를 오버라이드 해야 한다.

댓글남기기