Javamedium면접 빈도: medium

Default Method & Interface

#default-method#interface#java8#multiple-inheritance#abstract-class

📚먼저 읽어야 할 개념

이 문서를 이해하려면 아래 개념을 먼저 학습하는 것이 좋습니다.

Default Method & Interface

📌 디폴트 메서드란?

Java 8에서 도입

인터페이스에 구현된 메서드 선언 가능

기존 배포된 인터페이스 수정 어려움 극복


🔄 Java 인터페이스 변화

Java 8 이전

추상 메서드만 선언 가능


Java 8

정적 메서드와 디폴트 메서드 선언 가능


Java 9

private 메서드 선언 가능

외부 접근 불가능한 메서드


💡 디폴트 메서드 사용

기본 사용법

interface Foo {
    String getName(); // 추상 메서드
    
    default void printName() { // 디폴트 메서드
        System.out.println(getName());
    }
}

구현 클래스에서 재정의 불필요

필요시 오버라이드 가능


⚠️ 주의사항

1. 다중 상속 시 충돌

같은 이름 메서드가 두 인터페이스에 존재

구현 클래스에서 재정의 필수

interface Foo {
    void sameNameMethod();
}

interface Bar {
    void sameNameMethod();
}

class Impl implements Foo, Bar {
    @Override
    public void sameNameMethod() {
        // 재정의 필수
    }
}

2. Object 메서드 재정의 불가

equals(), hashCode() 재정의 불가


3. 정적 메서드 재정의 불가


4. 상속 관계 우선순위

자식 인터페이스가 부모 재정의 → 자식 우선

구현 클래스가 재정의 → 클래스 우선


😵‍💫 추상 클래스 vs 인터페이스

근본적으로 쓰임이 다름

비교는 참고용


🤝 공통점

1. 객체 생성 불가

new 연산자로 객체 생성 불가


2. 추상 메서드 보유

추상 메서드 가짐


3. 구현 강제

자손 클래스에서 추상 메서드 구현 필요


🆚 차이점

용도

추상 클래스: 공통점을 묶어 기능 확장

인터페이스: 동일한 동작 보장 명세


다중 상속

추상 클래스: 불가능

인터페이스: 가능


선언 가능 메서드

추상 클래스: 일반 메서드 + 추상 메서드

인터페이스: 추상 메서드 + 디폴트 메서드 + 정적 메서드 + private 메서드


변수와 생성자

추상 클래스: 생성자, 변수, 메서드 모두 가능

인터페이스: 메서드와 정적 상수만 가능


구현 강제성

추상 클래스: 선택적 오버라이딩

인터페이스: 모든 추상 메서드 구현 필수 (디폴트 메서드는 선택)


키워드

추상 클래스: extends

인터페이스: implements


🎯 사용 시나리오

추상 클래스 사용

연관성 있는 클래스들의 속성 추상화

예: 포유류, 조류 등 동물 계층 구조


인터페이스 사용

명세한 기능을 여러 클래스에서 재사용

예: Walkable, Flyable 등 동작 명세


❓ 면접 질문 예시

Q1. 디폴트 메서드란 무엇인가요?

답변: 디폴트 메서드는 Java 8에서 도입된 기능으로, 인터페이스에 구현된 메서드를 선언할 수 있습니다. 기존 배포된 인터페이스에 새로운 메서드를 추가할 때 모든 구현 클래스를 수정하지 않아도 되어 수정이 어려운 단점을 극복했습니다.

Q2. 디폴트 메서드 사용 시 주의사항은?

답변: 첫째, 다중 상속 시 같은 이름의 메서드가 두 인터페이스에 존재하면 구현 클래스에서 재정의해야 합니다. 둘째, equals(), hashCode() 같은 Object 클래스 메서드는 재정의할 수 없습니다. 셋째, 정적 메서드는 재정의할 수 없습니다. 넷째, 상속 관계에 따라 우선순위가 달라집니다.

Q3. 추상 클래스와 인터페이스의 공통점은?

답변: 첫째, new 연산자로 객체를 생성할 수 없습니다. 둘째, 추상 메서드를 가집니다. 셋째, 자손 클래스에서 추상 메서드를 구현해야 합니다.

Q4. 추상 클래스와 인터페이스의 차이점은?

답변: 용도 측면에서 추상 클래스는 공통점을 묶어 기능을 확장하고, 인터페이스는 동일한 동작을 보장하는 명세입니다. 다중 상속은 추상 클래스는 불가능하고 인터페이스는 가능합니다. 구현 강제성은 추상 클래스는 선택적 오버라이딩이고, 인터페이스는 모든 추상 메서드 구현이 필수입니다.

Q5. 추상 클래스와 인터페이스를 어떤 상황에 사용하나요?

답변: 추상 클래스는 연관성 있는 클래스들의 속성을 추상화할 때 사용합니다. 예를 들어 사자, 호랑이, 개를 포유류로, 닭, 오리, 독수리를 조류로 추상화할 수 있습니다. 인터페이스는 명세한 기능을 여러 클래스에서 재사용할 때 사용합니다. 예를 들어 Walkable, Flyable 등의 인터페이스를 정의해 각 동물의 기능을 명세할 수 있습니다.


📚 원본 참고 자료

출처: 2023-CS-Study

추가 학습 자료

🔗관련 문서

이 개념과 함께 학습하면 좋은 문서들입니다.

⬅️이 문서를 참조하는 문서

이 개념을 기반으로 하는 고급 주제들입니다.