본문 바로가기
Book

[독서 기록] 모던 자바 인 액션 13장, 디폴트 메서드

by Renechoi 2023. 1. 11.

모던 자바 인 액션 13장, 디폴트 메서드 

 


 

자바의 디폴트 메서드 : 기존 인터페이스를 구현하는 클래스가 자동으로 인터페이스에 추가도니 새로운 메서드의 디폴트 메서드를 상속받게 한다 

 

List 인터페이스의 sort 메서드 

default void sort(Comparator<? super E> c) {
	Collections.sort(this, c);
}

 

반환 형식 void 앞에 default라는 새로운 키워드가 등장했다. default 키워드는 해당 메서드가 디폴트 메서드임을 가리킨다. 여기서 sort 메서드는 Collections.sort 메서드를 호출한다. 이 새로운 디폴트 메서드 덕분에 리스트에 직접 sort를 호출할 수 있게 되었다. 

 

List<Integer> numbers = Arrays.asList(3, 5, 1, 2, 6); 
numbers.sort(Comparator.naturalOrder());

위 코드에서 Comparator.naturalOrder라는 새로운 메서드가 등장했다. naturalOrder는 자연 순서로 요소를 정렬할 수 있도록 Comparator 객체를 반환하는 Comparator 인터페이스에 추가된 새로운 정적 메서드다. 다음은 4장에서 사용한 Collection의 stream 메서드 정의 코드다. 

 

default Stream<E> stream() {
	return StreamSupport.stream(spliterator(), false);
}

- 410p 

 

 

결국 인터페이스가 아니라 추상 클래스 아닌가? 인터페이스와 추상 클래스는 같은 점이 많아졌지만 여전히 다른 점도 있다. 디폴트 메서드를 사용하는 이유는 뭘까? 디폴트 메서드는 주로 라이브러리 설계자들이 사용한다. ... 디폴트 메서드를 이용하면 자바 API의 호환성을 유지하면서 라이브러리를 바꿀 수 있다. 

- 411p 

 

 

 

디폴트 메서드가 없던 시절에는 인터페이스에 메서드를 추가하면서 여러 문제가 발생했다. 인터페이스에 새로 추가된 메서드를 구현하도록 인터페이스를 구현하는 기존 클래스를 고쳐야 했기 때문이었다. 본인이 직접 인터페이스와 이를 구현하는 클래스를 관리할 수 있는 상황이라면 이 문제를 어렵지 않게 해결할 수 있지만 인터페이스를 대중에 공개했을 때는 상황이 다르다. 그래서 디폴트 메서드가 탄생한 것이다. 디폴트 메서드를 이용하면 인터페이스의 기본 구현을 그대로 상속하므로 인터페이스에 자유롭게 새로운 메서드를 추가할 수 있게 된다. 

- 411p 

 

 

보통 자바에서는 인터페이스 그리고 인터페이스의 인스턴스를 활용할 수 있는 다양한 정적 메서드를 정의하는 유틸리티 클래스를 활용한다. 예를 들어 Collections는 Collection 객체를 활용할 수 있는 유틸리티 클래스다. 

- 412p 

 

 

함수형 인터페이스도 디폴트 메서드를 가질 수 있음 : Predicate, Function 등. . 

- 417p 

 

public class Monster implements Rotatable, Moveable, Resizable {
	... 
    모든 추상 메서드의 구현은 제공해야 하지만 디폴트 메서드의 구현은 제공할 필요가 없다. 
    
}
Monster monster = new Monster();
montster.rotateBy(180);
monster.moveVertically(10);

- 423p 

 

 

 

반응형