(자바 8) 디폴트 메소드

* 디폴트 메소드는 주로 라이브러리 설계자들이 사용한다.

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



우리가 라이브러리 설계자라면 기존 구현을 고치지 않고도 인터페이스를 바꿀 수 있으므로 디폴트 메소드를 잘 이해하는 것이 중요하다.


* 우리가 만드는 인터페이스에도 디폴트 메소드를 추가할 수 있따.
<디폴트 메소드 활용패턴>

1. 선택형 메소드
->자바8이전에는 Iterator에 remove메소드가 비어있었다.
하지만  자바 8의 Iterator인터페이스는 remove메소드를 정의한다.
기본 구현이 제공되므로 Iterator인터페이스를 구현하는 클래스는 빈 remove메소드를 구현할 필요가 ㅇ벗어졌고, 불피요한 코드를 줄일 수 있다.

2. 동작 다중 상속
->자바에서 클래스는 한 개의 다른 클래스만 상속 할 수 있지만 인터페이스는 여러개 구현할 수 있다.
디폴트 메소드를 이용하면 다중상속이 가능해진다.



* 다른 클래스나 인터페이스로부터 같은 시그니처를 갖는 메소드를 상속받을 때

<알아야 할 세 가지 해결 규칙>

1. 클랫가 항상 이긴다. 클래스나 슈퍼클래스에서 정의한 메소드가 디폴트 메소드보다 우선권을 갖는다.

2. 1번 규칙 이외의 상황에서는 서브 인터페이스가 이긴다. 상속관계를 갖는 인터페이스에서 같은 시그니처를 갖는 메소드를 정의할 때는 서브인터페이스가 이긴다. 즉, B가 A를 상속받는다면  B가 A를 이긴다.

3. 여전히 디폴트 메소드의 우선순위가 결정되지 않았다면 여러 인터페이스를 상속받는 클래스가 명시적으로 디폴트 메소드드를 오버라이드하고 호출해야 한다.



1번과 2번은 비교적 간단하다.

하지만 만약 두 인터페이스 A, B가 독립적으로 존재하고 클래스 C가 두 인터페이스를 구현했다면?? 이때는 Error가 발생한다.

이 때는 개발자가 직접 클래스 C에서 사용하려는 메소드를 명시적으로 선택해야 한다.


댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기