🧩 Java default method란?
- 인터페이스에 구현을 허용한 이유와 쓰임 정리
✅ default method란?
자바 8부터, 인터페이스 안에 메서드의 기본 구현(body)을 작성할 수 있게 되었고,
이때 사용하는 키워드가 바로 default입니다.
public interface MyInterface {
default void greet() {
System.out.println("Hello from default method!");
}
}
✔ 즉, 인터페이스지만 메서드 구현이 가능해진 겁니다.
🔍 왜 생겼을까? (등장 배경)
자바 8에서는 Stream, Lambda, Functional Interface 등 다양한 API가 추가되었고,
이를 기존 인터페이스에 기능을 추가해야 하는 상황이 생겼습니다.
하지만 기존 방식대로라면…
- 인터페이스에 메서드를 추가하면 모든 구현체가 컴파일 에러가 납니다!
→ 기존 라이브러리와 하위 호환 깨짐 😥
그래서!
기본 구현이 있는 메서드를 인터페이스에 추가할 수 있도록
default method가 도입되었습니다. (하위 호환 확보!)
🛠 사용 예제
public interface Vehicle {
void start();
default void honk() {
System.out.println("빵빵!");
}
}
public class Car implements Vehicle {
public void start() {
System.out.println("자동차 시동 켜짐");
}
}
public class Main {
public static void main(String[] args) {
Vehicle car = new Car();
car.start(); // 자동차 시동 켜짐
car.honk(); // 빵빵!
}
}
🔎 포인트
- Car 클래스는 honk()를 구현하지 않았지만, Vehicle에서 기본 구현이 제공되므로 바로 사용 가능
- 기존 인터페이스에 새로운 메서드를 추가해도 구현체는 깨지지 않음
🧠 default method는 override도 가능
public class Truck implements Vehicle {
public void start() {
System.out.println("트럭 시동 켜짐");
}
@Override
public void honk() {
System.out.println("트럭 빵빵!");
}
}
→ Truck에서는 honk() 메서드를 재정의해서 자신만의 동작을 가질 수 있어요.
⚠️ 주의할 점
항목 | 설명 |
다중 상속 충돌 | 두 인터페이스에 동일한 default 메서드가 있으면 명시적으로 오버라이드 해야 함 |
상태 유지 불가 | 인터페이스는 상태(필드)를 가질 수 없기 때문에 default method 내에서는 필드 사용 불가 |
남용 금지 | 너무 많은 로직을 default method에 넣으면 인터페이스가 무거워지고, 객체지향 설계 원칙을 해칠 수 있음 |
❗ 다중 상속 충돌 예시
interface A {
default void hello() { System.out.println("Hello from A"); }
}
interface B {
default void hello() { System.out.println("Hello from B"); }
}
class C implements A, B {
@Override
public void hello() {
A.super.hello(); // 또는 B.super.hello()
}
}
📌 default method vs abstract method
구분 | abstract method | default method |
구현 여부 | ❌ 없음 | ✅ 있음 |
오버라이드 필요 여부 | ✅ 반드시 구현해야 함 | ❌ 선택적으로 구현 가능 |
목적 | 공통 규약 선언 | 하위 호환 유지 및 공통 로직 제공 |
✅ 실무에서의 활용 팁
- 자주 반복되는 공통 동작을 미리 구현해줄 때 유용
- 하위 호환을 보장하며 API를 확장할 때 적합
- 인터페이스지만 전략 패턴처럼 일부 기본 동작을 제공하고, 필요한 부분만 구현하도록 유도할 수 있음
🔚 마무리 정리
항목 | 요약 |
정의 | 인터페이스에서 메서드 구현을 허용하는 기능 (default 키워드) |
목적 | 하위 호환성과 공통 구현 제공 |
사용 시 주의 | 다중 상속 충돌, 상태 불가, 남용 금지 |
실전 팁 | 전략 패턴, 유틸성 메서드, 기존 API 확장 등에 적합 |
default method는 단순한 문법이 아니라,
자바 인터페이스의 역할을 확장하고 객체지향을 유연하게 만드는 기능입니다.
적절히 활용하면 코드 중복을 줄이고 유지보수성을 높일 수 있습니다.
'Web Programming Language > JAVA' 카테고리의 다른 글
필드(Field)와 프로퍼티(Property)의 차이 (1) | 2025.04.22 |
---|---|
스트림(Stream) 활용 - 요소 병렬 처리(Parallel Processing) (0) | 2025.03.06 |
스트림(Stream) 활용 - 요소 정렬, 루핑(유소 개별 처리), 매칭(조건 만족 여부) (0) | 2025.03.06 |
스트림(Stream) 활용 - 요소 정렬, 루핑(유소 개별 처리), 매칭(조건 만족 여부) (1) | 2025.03.06 |
스트림(Stream) 활용 - 리소스로부터 스트림 얻기, 요소 걸러내기(필터링), 요소 변환(매핑) (0) | 2025.03.06 |