디폴트 메소드는 jdk 1.8부터 생긴 메소드입니다.
추가된 이유는 interface 구현 문제 때문인데 이에 대해 예시를 보며 알아보도록 하겠습니다.
Car 클래스가 Runnable 인터페이스를 상속받는 예시를 확인해 보겠습니다.
interface Runnable {
void forward(int d); // 인터페이스의 메소드는 항상 추상메소드 public abstract
}
class Car implements Runnable {
String type;
String color;
public void forward(int d) {
System.out.println("move : " + d);
}
}
이때 만약에 Runnable 인터페이스에 변경사항이 생긴다면 어떻게 될까요? Runnable 한 것은 전진도 할 수 있지만 후진도 할 수 있습니다.
interface Runnable {
void forward(int d); // 인터페이스의 메소드는 항상 추상메소드 public abstract
void backward(int d);
}
// 컴파일 에러!
class Car implements Runnable {
String type;
String color;
public void forward(int d) {
System.out.println("move : " + d);
}
}
Car는 인터페이스에 정의된 모든 추상메소드를 구현하지 못하였습니다. 그렇기 때문에 컴파일 오류가 나는데 이를 고치는 방법은 두 가지입니다.
Car를 abstract class로 선언하기- backward() 구현해 주기
1번 방법은 Car를 또다시 구현해 주는 클래스를 만들어주어야 하기 때문에 또 다른 클래스를 만들어야 한다는 문제가 있습니다.
2번 방법이 가장 합리적인 거 같습니다. 그러나! interface 가 여러 구현체에 상속되어 있다면 그 모든 구현체에 backward() 메소드를 정의해주어야 합니다. interface 가 만약 라이브러리 같은 거라면 전 세계에서 해당 라이브러리를 쓴 모든 프로젝트가 코드를 바꿔야 하는 불상사가 일어나죠!
그렇기 때문에 디폴트 메소드가 등장합니다. 디폴트 메소드는 추상 메소드와 달리 구현부를 가집니다.
interface Runnable {
void forward(int d);
default void backward(int d) {
System.out.println("Runnable.backward");
}
}
class Car implements Runnable {
String type;
String color;
public void forward(int d) {
System.out.println("Car.forward");
}
}
인터페이스에 추가되어야 할 메소드를 디폴트 메소드로 선언한다면 이를 상속받는 클래스에 변경점이 없습니다.
이러한 이유로 디폴트 메소드가 jdk 1.8부터 추가됩니다!
'📗Java' 카테고리의 다른 글
[Java] 예시와 함께 알아보는 추상화 - 추상클래스와 인터페이스 (0) | 2023.07.20 |
---|---|
[Java] Chained Exception (0) | 2023.07.20 |
[Java] 생성자 super() 와 참조변수 super (0) | 2023.07.14 |
[Java] 생성자 this() 와 참조변수 this (0) | 2023.07.13 |
[Java] JVM 메모리 관리 (2) | 2023.07.13 |