프로그래밍자바 개발자

자바에서 기본 메서드(default methods)를 가진 인터페이스란 무엇이며, 사용 시 주의 사항은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

자바 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라는 이름의 기본 메서드를 사용하려 했으나, 이는 상속 클래스에서 메서드 재정의에 영향을 주지 않았고, 이로 인해 오류 원인을 파악하는 데 오랜 시간이 걸렸으며 인터페이스 구조를 재설계해야 했습니다.