본문 바로가기

Language/Java Plus

Effective JAVA - Item21 : 인터페이스는 구현하는 쪽을 생각해서 설계하라.

 

 

 

 

이 파트는 인터페이스 디폴트 메서드에 대해서 주로 다루고 있다.

내용을 요약하자면 디폴트 메서드를 통해 인터페이스에 새로운 메서드를 추가하는 일이 가능해졌지만 문제가 많으니 항상 인터페이스를 구현할때는 신중하게 할 것을 강조한다.

 

 

 

인터페이스의 가장 큰 단점

자바는 기본적으로 릴리스가 존재한다. 릴리스를 개시하면 사용자들은 그 릴리스를 사용하게 된다.

인터페이스는 자바 8 이전까지 메서드 추가/삭제가 어려웠다. 디폴트 메서드가 부재하던 시절에 새로운 메서드를 추가하거나 삭제한다면 이 인터페이스를 구현한 모든 클래스가 해당 메서드를 삭제 또는 재정의해야했기 때문이다.

 

하지만 디폴트 메서드가 추가되면서 구현체들은 해당 메서드를 재정의해야함이 강제되지 않기때문에 이런 문제가 줄어드나 싶었다.

그렇지는 않은듯 싶다.

 

 

"모든 경우를 대비해 디폴트 메서드를 만드는 것은 불가능하다"

디폴트 메서드도 결국은 인터페이스를 구현한 구현체에서 사용하게 하기 위해 제작한 것이다. 하지만 모든 구현체가 이 메서드를 사용하리란 불가능하다.

 

자바 플랫폼의 속한 클래스들은 구현한 인터페이스에서 추가한 디폴트 메서드를 재정의하고 올바르게 사용할 수 있게끔 수정을 하여 사용을 하면서 이런 문제를 조금은 해소를 했다.

 

- 하지만 모든 우리와 같은 개발자가 해당 인터페이스 수정시 클래스를 맞게 수정하리란 어렵다.

- 또한, 컴파일이 성공했더라도 런타임 오류가 발생하는 경우도 많아서 더더욱 해당 문제를 어렵게 만든다.

 

 

 

필자의 결론은 아래와 같다.

1
// 결론적으로 만들어져 이미 배포된 인터페이스에 디폴트 메서드를 추가하는 일은 피해야한다.
// 반면, 새롭게 만드는 인터페이스라면 표준적인 메서드 구현을 제공하는 아주 유용한 수단이며,
// 인터페이스를 쉽게 구현하게 해준다.

2
// 인터페이스 구현은 정말 세심하게 하자

3
// 인터페이스를 릴리스한 후라도 결함을 수정하는게 가능한 경우도 있겠지만, 절대 그 가능성에 기대서는 안된다.

 

 

코드

https://github.com/mokjaemin/EffectiveJAVA

 

GitHub - mokjaemin/EffectiveJAVA: Study Files Of Effective JAVA

Study Files Of Effective JAVA. Contribute to mokjaemin/EffectiveJAVA development by creating an account on GitHub.

github.com