*예시
interface Vehicle {
void start();
void stop();
default void honk() {
System.out.println("빵빵!");
}
default String getVehicleType() {
return "일반 차량";
}
}
class Car implements Vehicle {
@Override
public void start() {
System.out.println("자동차가 출발합니다.");
}
@Override
public void stop() {
System.out.println("자동차가 정지합니다.");
}
// getVehicleType() 메소드 오버라이드
@Override
public String getVehicleType() {
return "승용차";
}
}
class Truck implements Vehicle {
@Override
public void start() {
System.out.println("트럭이 출발합니다.");
}
@Override
public void stop() {
System.out.println("트럭이 정지합니다.");
}
// honk() 메소드 오버라이드
@Override
public void honk() {
System.out.println("트럭: 빵빵빵!!!");
}
}
public class Main {
public static void main(String[] args) {
Vehicle car = new Car();
Vehicle truck = new Truck();
car.start();
car.honk(); // 기본 구현 사용
System.out.println("차량 유형: " + car.getVehicleType()); // 오버라이드된 메소드 사용
truck.start();
truck.honk(); // 오버라이드된 메소드 사용
System.out.println("차량 유형: " + truck.getVehicleType()); // 기본 구현 사용
}
}
default 메소드는 이처럼 구현 클래스에서 구현하지 않아도 되는 인터페이스 메소드이다.
물론 구현 클래스에서 오버라이드도 가능하다.
이전에는 인터페이스에 의존되어 있는 코드의 크기가 클 경우 인터페이스에 하나를 추가하려면 비용이 많이 발생했다.
디폴트 메소드는 기존의 코드를 건드리지 않고도 원래의 인터페이스 설계를 자유롭게 확장할 수 있는 장점이 있어 현재 많이 활용되고 있다.
'Java' 카테고리의 다른 글
정적 바인딩 & 동적 바인딩 (0) | 2024.07.17 |
---|---|
다중 상속 (1) | 2024.07.17 |
static 메소드 vs 인스턴스 메소드 (0) | 2024.07.17 |
이펙티브 자바 - Item(1) 생성자 대신 정적 팩터리 메소드를 고려하라 (0) | 2024.07.15 |
Java CS 대비 정리(자료형, JVM, JRE, JDK) (0) | 2024.06.05 |