자바 8부터는 인터페이스에서 메서드 본문을 가질 수 있도록 허용해 주어, 기존 코드를 깨뜨리지 않고 새 기능을 추가할 수 있게 되었다.
인터페이스에 메서드를 새로 추가하면서, 기본 구현을 제공할 수 있는 기능이다
메서드를 default 키워드로 작성하고 기본 구현을 넣어두면, 구현 클래스들은 이 메서드를 굳이 재정의하지 않아도 된다.
목적 : 이미 배포된 인터페이스에 새 메서드를 추가할 때 발생하는 하위 호환성 문제를 해결하기 위해
주의할점 : 서로 다른 인터페이스에 동일한 시그니처의 디폴트 메서드가 존재하면 충돌이 일어난다.
public class NotifierMainV2 {
public static void main(String[] args) {
List<Notifier> notifiers = List.of(new EmailNotifier(), new SMSNotifier(), new AppPushNotifier());
notifiers.forEach(n -> n.notify("서비스 가입을 환영합니다!"));
// 스케줄 기능 추가
LocalDateTime plus1Days = LocalDateTime.now().plusDays(1);
notifiers.forEach( n -> {
n.scheduleNotification("hello!", plus1Days); // override 되어 있지 않으면 작동한다.
});
}
}
public interface Notifier {
// 알림을 보내는 기능
void notify(String message);
// 신규 기능 추가
default void scheduleNotification(String message, LocalDateTime scheduleTime) {
System.out.println("[기본 스케줄링] message: " + message + ", time: " + scheduleTime);
}
}