본문 바로가기

개발/Java

[Java] 인터페이스에서 default 메서드와 static 메서드의 필요성

default 메서드 

 디폴트 메서드는 추상 메서드의 기본적인 구현을 제공하는 메서드이다.

  • 메서드 앞에 default 키워드를 붙이며 블럭{ }이 존재해야 한다.
  • default 메서드의 접근 제어자는 public이며 생략이 가능하다.

사용 예시 코드

public class Main implements A {

    @Override
    public void a() {
        System.out.println("A");
    }


    public static void main(String[] args) {
        Main main = new Main();
        main.a();

        // 디폴트 메서드 재정의 없이 바로 사용가능합니다.
        main.aa();
    }
}

interface A {
    void a();
    default void aa() {
        System.out.println("AA");
    }
}

 

 

 

 

 

static 메서드

디폴트 메서드와 마찬가지로 추상 메서드의 기본적인 구현을 제공하는 메서드이다.

  • static의 특성 그대로 인터페이스의 static 메서드 또한 객체 없이 호출이 가능하다.
  • 선언하는 방법과 호출하는 방법은 클래스의 static 메서드와 동일합니다.

사용 예시 코드

public class Main implements A {

    @Override
    public void a() {
        System.out.println("A");
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.a();
        main.aa();
        System.out.println();

        // static 메서드 aaa() 호출
        A.aaa();
    }
}

interface A {
    void a();
    default void aa() {
        System.out.println("AA");
    }
    static void aaa() {
        System.out.println("static method");
    }
}

 

 

 

 

 

인터페이스에서 default 메서드와 static 메서드가 필요한 이유

 

여러 클래스에서 공통적으로 사용되는 기능을 상위개념으로 묶어서 인터페이스를 생성한 후, 그 클래스들에 인터페이스를 적용해두었는데, 나~중에 인터페이스를 적용한 여러 클래스들 중 하나의 클래스에서 기능(메서드)을 추가할 필요가 있을 때, default 메서드와 static 메서드를 사용하면 적절하게 대처할 수 있다.

 

인터페이스의 멤버 메서드들은 모두 추상 메서드이기때문에 인터페이스에 정의된 메서드들은 모두 하위 클래스에서 구현을 해주어야한다. 그런데 한 클래스에서 기능이 추가로 필요하다고 추상 메서드를 만들어버리면 다른 하위 클래스들에선 사용하지도 않는 추상 메서드를 구현해야하는 번거로움이 있고 그렇다고 만들어둔 인터페이스를 다른 걸로 대체하기에도 번거로움이 있다.

 

이럴 때 default 메서드와 static메서드를 사용해 인터페이스에 메서드를 직접 구현해둠으로써 추상 메서드가 아니기에 다른 하위 클래스에서는 따로 구현하지 않아도 됨과 동시에 새로 구현해둔 default / static 메서드가 필요한 클래스들만 인터페이스에서 가져다 쓰면 된다.