티스토리 뷰

전통적인 자바에서 인터페이스와 관련 메서드는 한 몸처럼 구성된다. 인터페이스를 구현하는 클래스는 인터페이스에서 정의하는 모든 메서드 구현을 제공하거나 슈퍼클래스의 구현을 상속받아야 한다.

 

예를 들어보자. CRUD의 추상메서드를 가지고 있는 인터페이스가 있다.

 

 

그리고 위 인터페이스를 구현하는 클래스는 인터페이스에서 정의하는 모든 메서드 구현을 제공하거나 슈퍼클래스의 구현을 상속받아야 한다. 그렇게 하지 않으면 오류가 뜰 것이다.

 

인터페이스를 상속받고 구현한 코드
구현을 다 하지 않아 빨간줄이 뜬 모습

 

평소에는 이 규칙을 지키는 데 아무 문제가 없지만 라이브러리 설계자 입장에서 인터페이스에 새로운 메서드를 추가하는 등 인터페이스를 바꾸고 싶을 때는 문제가 발생한다.

위 예제를 다시 들어 나는 CRUD 인터페이스를 설계한 설계자이다. 어느 날 나는 CRUD 인터페이스에 제목으로 검색할 수 있는 findByTitle이라는 새로운 메서드를 추가하고 싶다. 그래서 추가를 했다.

 

 

그리고 CRUD를 구현했던 모든 프로그래머가 findByTitle 메서드를 구현하도록 CRUD 인터페이스를 상속한 모든 클래스를 고쳐야 한다고 발표를 했다. 그럼 전세계에 CRUD 인터페이스를 상속받은 클래스를 구현한 개발자들, 제목으로 찾는 메서드는 필요없는 사람들 등 다 고쳐야 한다. 

 

그래서 자바에서 위 문제점을 해결할 수 있는 2가지 방법을 제공한다.

 

  • 정적 메서드 : 인터페이스 내부에 정적 메서드를 사용하는 것
  • 디폴트 메서드 : 인터페이스의 기본 구현을 제공할 수 있도록 하는 것

 

즉, 메서드 구현을 포함하는 인터페이스를 정의할 수 있게 되었다. 결과적으로 기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메서드의 디폴트 메서드를 상속받게 된다. 이렇게 하면 기존에 인터페이스를 구현한 코드를 바꾸도록 강요하지 않으면서 인터페이스를 바꿀 수 있다. 

 

예를 들어 아까 추가하려던 findByTitle을 디폴트 메서드로 추가해보자.

 

 

반환 형식인 List<BoardResponseDto> 앞에 default라는 새로운 키워드가 등장했다. default 키워드는 해당 메서드가 디폴트 메서드임을 가리킨다. 이 새로운 디폴트 메서드 덕분에 구현하지 않아도 인터페이스에서 findByTitle을 호출할 수 있게 되었다.

 

findByTitle을 구현하지 않음
바로 가져다 쓸 수 있음

 

즉, 설계자는 개발자들에게 기존의 코드를 바꾸도록 강요하지 않으면서 메서드를 추가할 수 있고, 개발자들은 안쓰는 메서드를 구현할 필요가 없고, 만약 쓴다면 바로 호출해서 쓰면 된다는 장점이 있다.

 

또다른 장점은 다중 상속 동작이라는 유연성을 제공하면서 프로그램 구성에도 도움을 준다는 장점도 있다.

(다중 상속 동작은 클래스는 여러 디폴트 메서드를 상속받을 수 있게 된다)

 

2. 실제로 디폴트 메서드를 활용한 예시

대표적으로 List 인터페이스의 sort 메서드이다. sort메서드는 자바8에서 새로 추가된 메서드다. 

다음은 sort의 구현 코드다.

 

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

 

여기서 sort 메서드는 Collections.sort 메서드를 호출한다.

이렇게 디폴트 메서드를 활용함으로써 리스트에 직접 sort를 호출할 수 있게 되었다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday