이펙티브 자바 #item21 인터페이스는 구현하는 쪽을 생각해 설계하라

임현규·2023년 1월 26일
0

이펙티브 자바

목록 보기
21/47
post-thumbnail

자바 8 이전, 이후의 인터페이스

자바 8 이전의 인터페이스는 모든 클래스가 현재의 인터페이스에 새로운 메서드가 추가될 일은 없다는 생각으로 가정하고 작성했다. 그렇기에 메서드를 인터페이스에 추가하면 컴파일 에러가 발생하고 해당 인터페이스를 타입으로 삼는 모든 구현 클래스에 추가된 메서드를 모두 구현해주어야 한다.

그러나 자바 8 이후에는 default 메서드가 추가되었다. default 메서드는 인터페이스에서 구현을 하는 메서드로 이를 타입으로 삼는 모든 구현체에도 똑같이 구현 내용이 적용된다. 인터페이스를 확장하기 용이해졌다. 보통 주로 람다에 많이 활용한다.

인터페이스의 구현 default 사용시 유의점

1. 모든 상황에서 불변식을 해치지 않도록 디폴드 메서드를 작성해야한다.

인터페이스 중간에 추가하는 방식이 default 메서드 추가가 효과적이라 말했지만, default 메서드는 모두 범용적으로 적용되야하기 때문에 분명히 설계가 필요하다.

2. 디폴트 메서드는 컴파일에 성공하더라도 기존 구현체에 런타임 오류를 발생시킬 수 있다.

default 메서드를 추가함으로 인해 하위 구현체에서 뜻하지 않게 런타임 예외를 발생할 수 있다. 해당 구현체가 가지고 있는 멤버 변수나 특징이 다르지만 공통된 구현 메서드를 가지기 때문에 발생하는 문제이다. 그렇기에 디폴트 메서드는 왠만하면 사용을 피해야하고 꼭 필요한 부분에 사용해야 한다.

디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 변경하려는 용도가 아님을 명심하자. 해당 방식으로 리펙토링을 한다면 잘못된 것이다. 그 이유는 기존의 클라이언트를 망가뜨리기 때문이다. 모든 구현체가 범용적으로 사용하며, 인터페이스에 개념을 추가해야하는 경우 사용하자..

profile
엘 프사이 콩그루

0개의 댓글