자바 8 이전의 인터페이스는 모든 클래스가 현재의 인터페이스에 새로운 메서드가 추가될 일은 없다는 생각으로 가정하고 작성했다. 그렇기에 메서드를 인터페이스에 추가하면 컴파일 에러가 발생하고 해당 인터페이스를 타입으로 삼는 모든 구현 클래스에 추가된 메서드를 모두 구현해주어야 한다.
그러나 자바 8 이후에는 default 메서드가 추가되었다. default 메서드는 인터페이스에서 구현
을 하는 메서드로 이를 타입으로 삼는 모든 구현체에도 똑같이 구현 내용이 적용된다. 인터페이스를 확장하기 용이해졌다. 보통 주로 람다에 많이 활용한다.
인터페이스 중간에 추가하는 방식이 default 메서드 추가가 효과적이라 말했지만, default 메서드는 모두 범용적으로 적용되야하기 때문에 분명히 설계가 필요하다.
default 메서드를 추가함으로 인해 하위 구현체에서 뜻하지 않게 런타임 예외를 발생할 수 있다. 해당 구현체가 가지고 있는 멤버 변수나 특징이 다르지만 공통된 구현 메서드를 가지기 때문에 발생하는 문제이다. 그렇기에 디폴트 메서드는 왠만하면 사용을 피해야하고 꼭 필요한 부분에 사용해야 한다.
디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 변경하려는 용도가 아님을 명심하자. 해당 방식으로 리펙토링을 한다면 잘못된 것이다. 그 이유는 기존의 클라이언트를 망가뜨리기 때문이다. 모든 구현체가 범용적으로 사용하며, 인터페이스에 개념을 추가해야하는 경우 사용하자..