인터페이스에서 디폴트 메서드를 허용한 이유는 기존 인터페이스를 확장해서 새로운 기능을 추가하기 위해서이다. 기존 인터페이스의 이름과 추상 메서드의 변경 없이 디폰트 메서드만 추가할 수 있기 때문에 이전에 개발한 구현 클래스를 그대로 사용할 수 있으면서 새롭게 개발하는 클래스는 디폴트 메서드를 활용할 수 있다.
보통 기존에 있던 인터페이스에 이를 구현할 클래스가 있는데 인터페이스에 기능을 추가해야 하여 인터페이스에 추상 메서드를 추가했는데 클래스에서 문제가 발생한다.
그 이유는 추상 메서드에 대한 실체 메서드가 존재하지 않기 때문인데 여기서 클래스를 수정할 여건이 안된다면 인터페이스에 메서드를 추가할 수 없게 된다. 그래서 인터페이스에 디폴트 메서드를 선언해준다.
디폴트 메서드는 추상 메서드가 아니기 때문에 구현 클래스에서 실체 메서드를 작성할 필요가 없다.
따라서 클래스는 아무런 문제 없이 계속 사용할수 있다.
public interface MyInterface {
// 추상 메서드
public void method1();
}
public class MyClassA implements MyInterface {
@Override // 실체메서드 정의
public void method1() {
System.out.println("MyClassA-method() 실행");
}
}
디폴트 메서드를 추가해보겠습니다.
public interface MyInterface {
// 추상 메서드
public void method1();
// 디폴트 메서드
public default void method2() {
System.out.println("MyInterface-method2 실행");
}
}
인터페이스를 수정하였는데 컴파일 에러가 발생하지 않습니다.
이번에는 인터페이스를 구현하는 새로운 구현 클래스인 MyClassB를 조금 바꿔서 정의해보겠습니다.
public class MyClassB implements MyInterface {
@Override
public void method1() {
System.out.println("MyClassB-method 실행");
}
@Override // 디폴트 메서드 재정의
public void method2() {
System.out.println("MyClassB-method2() 실행");
}
}
이제 MyClassA와 MyClassB를 객체로 생성하고 인터페이스 변수에 메서드 1. 메서드 2를 호출해 보고 결과를 보겠습니다.
public class DefaultMethodEx {
public static void main(String[] args) {
MyInterface mi1 = new MyClassA();
mi1.method1();
mi1.method2();
MyInterface mi2 = new MyClassB();
mi2.method1();
mi2.method2();
}
}
부모 인터페이스에 디폴트 메서드가 정의 되어 있을 경우 자식 인터페이스에서 디폴트 메서드를 활용히는 방법은 다음 세 가지가 있다.
• 디폴트 메소드를 단순히 상속만 받는다
• 디폴트 메소드를 재정의 (Override) 해서 실행 내용을 변경한다
• 디폴트 메소드를 추상 메소드로 재선언한다
'JAVA' 카테고리의 다른 글
컬렉션 프레임워크 ArrayList (0) | 2022.05.30 |
---|---|
예외 처리 (0) | 2022.05.26 |
2022년 5월 25일 수업중 과제 : 계산기 프로그램 (0) | 2022.05.25 |
인터페이스 (0) | 2022.05.24 |
상수의 데이터 타입 (0) | 2022.05.15 |