woowacourse-study / 2022-modern-java-in-action

우아한테크코스 4기 모던 자바 인 액션 스터디
10 stars 4 forks source link

디폴트 메서드란 무엇인가? #8

Open sure-why-not opened 2 years ago

sure-why-not commented 2 years ago

문제

기존에는 인터페이스에 메서드를 추가하게 되면 모든 구현 클래스들이 해당 메서드를 구현해야했다. 자바 8에서 인터페이스를 쉽게 바꿀 수 있도록 디폴트 메서드를 지원하게 되며, 이러한 고통을 덜어주었다. 그렇다면 디폴트 메서드란 무엇인가?

선정 배경

가장 큰 변화가 있었던 자바 8에서 추가된 기능이다. 해당 기능을 통해 Collectionstream 메서드를 구현 클래스(ex. ArrayList)에서 추가적으로 구현하지 않고도 사용할 수 있게 되었다. 이처럼 인터페이스 설계를 자유롭게 확장시켜준 디폴트 메서드에 대해 간략하게 알아보면 좋을 것 같다.

관련 챕터

sure-why-not commented 2 years ago

디폴트 메서드는 자바8에서 추가된 기능이다. 기존에는 인터페이스에 메서드를 추가하게 되면 모든 구현 클래스들이 해당 메서드를 구현해야 했다. 인터페이스 규격명세에서 디폴트라는 새로운 키워드를 지원하게 되면서 구현 클래스에서 구현하지 않아도 되는 메서드를 인터페이스에 추가할 수 있게 되었다.

또 자바8에서 추가된 핵심 기능인 스트림 API 와도 연관이 있다. 컬렉션 인터페이스에 stream 메서드를 추가하게 되었을 때 기존에는 ArrayList 클래스에서 해당 메서드를 구현했어야 했는데 디폴트 메서드로 선언되어 있기 때문에 구현하지 않아도 사용할 수 있게 되었다.

이처럼 디폴트 메서드를 이용하면 기존의 코드를 건드리지 않고도 원래의 인터페이스 설계를 자유롭게 확장해줄 수 있다는 것을 확인해 볼 수 있다.

그렇다면 이런 장점을 가지고 있는 디폴트 메서드는 무조건 사용하는 것이 좋은 방법일까? 이미 구현한 객체에 오류가 발생할 소지가 있기 때문에 인터페이스에 새로운 메서드를 추가하는 것은 어려운 일이다. 모든 상황에서의 불변식을 해치지 않는 디폴트 메서드를 작성하는 것은 쉽지 않은 방법일 것이다.

디폴트 메서드가 컴파일에 성공하더라도 기존 구현체에 런타임 오류를 일으킬 수 있기 때문에 기존 인터페이스에 디폴트 메서드로 새 메서드를 추가하는 일은 꼭 필요한 경우가 아니라면 피하는 것이 좋다. 만약 추가하게 된다면 세심한 주의와 많은 테스트가 필요하다. 그리고 디폴트 메서드가 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도가 아님을 명심해야 한다.

[참고] 이펙티브 자바 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라