Interface Default & Static Method

September 24, 2021

자바 8 이전의 인터페이스에서 선언하는 메서드는 모두 public abstract 선언이며, 인터페이스를 구현하는 클래스에서는 정의된 모든 메서드를 오버라이딩 해야했다. 그러나 자바 8에서 인터페이스에 대한 변경점으로 defaultstatic 메서드 선언이 가능해졌다.

default method

default method는 인터페이스를 구현한 모든 객체에서 공통적으로 사용할 수 있는 메서드를 말한다.

public interface MyInterface {
    ...

    default void defaultMethod() {
        System.out.println("Default Method Running!");
    }
}
public class MyClass implements MyInterface{
    ...
}
MyClass myClass = new MyClass();
myClass.defaultMethod(); // Default Method Running!

자바에서는 다중 상속은 불가능하지만 여러 개의 인터페이스를 구현하는 것은 가능하다. 만약 동일한 이름의 default method를 가진 여러 인터페이스를 구현한다면 어떻게 될까?

public interface Foo {
    ...

    default void defaultMethod() {
        System.out.println("This is Foo!");
    }
}
public interface Bar {
    ...

    default void defaultMethod() {
        System.out.println("This is Bar!");
    }
}
// Foo, Bar에 동일한 default void defaultMethod()가 정의되었다면?
public class MyClass implements Foo, Bar {
    ...
}

이는 컴파일되지 않는다. Foo 또는 Bar의 어느 메서드를 사용할지 우선시 되는 것은 없고 모호하게 보기 때문이다. 이를 컴파일하려면 구현 클래스에서 별도로 메서드를 오버라이딩하여 모호함을 해결해야 한다.

public class MyClass implements Foo, Bar{
    // 오버라이딩이 답이다.
    @Override
    public void defaultMethod() {
        System.out.println("Overriding!");
    }
}

static method

인터페이스에서 static 메서드를 정의하여 유틸 성격의 메서드를 구현하는 것도 가능하게 되었다. 다만 이를 구현한 클래스의 API로써 포함되는 것이 아니라, 인터페이스 이름을 통해 호출할 수 있다.

public interface MyInterface {
    ...

    static void staticMethod() {
        System.out.println("Static Method Running!");
    }
}
MyInterface.staticMethod();

참고


songmk 🙁