코린이의 소소한 공부노트

디폴트 메서드 본문

Java

디폴트 메서드

무지맘 2022. 5. 15. 13:11

인터페이스는

1. 추상 메서드의 집합으로,

2. 부수적으로 상수, 디폴트 메서드, 스태틱 메서드를 선언할 수 있다.(jdk 1.8부터 적용)

interface A {
    void method1();
    void method2();
}

class B implements A{
    public void method1() { }
    public void method2() { }
}

abstract class C implements A{
    public void method2() { }
}

  - 어떤 클래스(B)가 인터페이스(A)를 구현할 경우, A에 선언된 모든 추상 메서드를 구현해야 한다. 만약 모든 메서드를 구현하지 않는다고 하면 추상 클래스(C)로 만들어야 한다.

  - 이 상태에서 인터페이스(A)에 새로운 추상 메서드를 추가하게 되면

    a. 일반 클래스(B)는 무조건 새 추상 메서드를 구현해야 한다.

    -> 이러한 불편함을 없애기 위해 나온 해결책이 디폴트 메서드이다.

    b. 추상 클래스(C)는 구현하지 않아도 된다.

// 인터페이스 A에 새 메서드를 추가할 때
1)
interface A {
    void method1();
    void method2();
    void newMethod(); // 추상 메서드
}

2)
interface A {
    void method1();
    void method2();
    default void newMethod() { } // 디폴트 메서드
}

[디폴트 메서드]

1. 인스턴스 메서드이다.

  - 인스턴스 메서드는 객체 생성 후 사용이 가능한 메서드이다.

  - iv 사용이 가능한 메서드이지만, 인터페이스에는 iv를 선언할 수 없다.

  - 접근 제어자가 default인 메서드는 해당 인터페이스가 속한 패키지 내에서만 접근이 가능하다.

2. 모든 멤버가 public인 인터페이스 원칙에 위반된다.

  - 하지만 인터페이스에 새 메서드가 추가될 때마다 해당 인터페이스를 구현한 모든 클래스에서 새 메서드를 구현하는 불편함을 없애기 위해 예외를 허용한 것이다.

3. 기존의 메서드와 충돌할 때 직접 오버 라이딩을 하거나, 아래 내용을 읽고 충돌 문제를 해결한다.

 1) 여러 인터페이스의 디폴트 메서드 간의 충돌

  - 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버 라이딩(덮어쓰기, 재정의)해야 한다.

 2) 디폴트 메서드와 조상 클래스의 메서드 간의 충돌

  - 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

 

'Java' 카테고리의 다른 글

익명 클래스  (0) 2022.05.19
내부 클래스  (0) 2022.05.19
인터페이스의 장점  (0) 2022.05.13
인터페이스 선언, 상속, 구현  (0) 2022.05.13
추상 클래스 작성하기  (0) 2022.05.11