자바 8에서는 기본 메서드라는 개념이 도입되었습니다. 이는 인터페이스 내에 선언된 구현을 가진 메서드로, 기존의 구현과 호환성을 해치지 않고 인터페이스에 새로운 메서드를 추가할 수 있게 해줍니다.
문법:
public interface MyInterface { default void printHello() { System.out.println("Hello!"); } }
특징 및 주의 사항:
Object 클래스의 메서드(예: equals, hashCode)를 재정의할 수 없습니다.클래스가 동일한 기본 메서드를 가진 두 개의 인터페이스를 구현하고 해당 메서드를 재정의하지 않으면 어떻게 되나요?
답변: 컴파일러는 "class... inherits unrelated defaults for ... from types ... and ..."라는 오류를 발생시키며, 클래스 내에서 해당 메서드를 명시적으로 구현해야 합니다.
예제:
interface A { default void doSomething() { System.out.println("A"); } } interface B { default void doSomething() { System.out.println("B"); } } class C implements A, B {} // 컴파일 오류!
해결책:
class C implements A, B { @Override public void doSomething() { A.super.doSomething(); // 또는 B.super.doSomething() } }
이야기
팀 프로젝트에서 API 마이그레이션을 위해 공통 인터페이스에 기본 메서드를 추가했습니다. 이전 인터페이스 구현체가 새 메서드를 재정의하지 않아 기본 구현이 예상되는 로직 대신 실행되어 사용자들은 기능 저하를 경험했습니다.
이야기
라이브러리를 확장하는 과정에서 한 개발자가 공통 인터페이스에 비즈니스 로직이 포함된 기본 메서드를 추가했습니다. 이후 다른 인터페이스에 서로 다른 동작을 가진 동일한 메서드를 추가하면서 상속 충돌이 발생하여 새로운 구현을 컴파일할 수 없었습니다.
이야기
개발자가 인터페이스에서
hashCode라는 이름의 기본 메서드를 사용하려 했으나, 이는 상속 클래스에서 메서드 재정의에 영향을 주지 않았고, 이로 인해 오류 원인을 파악하는 데 오랜 시간이 걸렸으며 인터페이스 구조를 재설계해야 했습니다.