자바 8에서는 인터페이스에 기본 구현을 제공할 수 있도록 디폴트 메서드라는 기능을 제공한다. 기존 인터페이스를 구현하는 클래스는 자동으로 인터페이스에 추가된 새로운 메서드의 디폴트 메서드를 상속받게 된다. 이렇게 하면 기존의 코드 구현을 바꾸지 않아도 된다는 장점이 있다.
자바에서 클래스는 한 개의 다른 클래스를 상속할 수 있지만 인터페이스는 여러 개 구현할 수 있다.
pulbic interface Rotatable {
void setRotationAngle(int angleInDegrees);
int getRotationAngle();
default void rotateBy(int angleInDegrees) {
setRotationAngle((getRotationAngle () + angleInDegrees) % 360);
}
}
위 인터페이스는 구현해야 할 다른 메서드에 따라 뼈대 알고리즘이 결정되는 템플릿 디자인 패턴과 비슷해 보인다.
Rotatable을 구현하는 모든 클래스는 setRotationAngle() 과 getRotationAngle의 구현을 하게 되면 rotateBy는 구현하지 않더라도 기본적으로 사용할 수 있게 된다.
위의 규칙을 쉽게 표현하자면 구체적일수록 우선순위를 갖는다이다. 스프링에서도 통용되는 규칙이다. 구체적일수록 우선순위를 갖는다를 기억하자.