티스토리 뷰

728x90
반응형

인터페이스는 구현하는 쪽을 생각해 설계하라


  • Java 8버전 부터는 인터페이스에도 default 메서드를 추가할 수 있습니다. 해당 default 메서드를 사용하여 인터페이스 내에도 로직을 직접 추가할 수 있게 되었습니다.
  • default 메서드를 선언하면, 구현한 모든 클래스에서 default 메서드가 쓰이게 됩니다.

💡예제 코드

  • Phone 인터페이스와 이를 구현한 IPhone 클래스가 있습니다. 그런데 기존에는 해당 인터페이스에 call 메서드만 있었는데 기능 추가를 위해 videoCall 메서드가 추가되야하는 상황이 되었습니다. 그래서 이 메서드를 인터페이스에 추가하면 해당 인터페이스를 구현하는 모든 하위 클래스에서 메서드를 구현하지 않으면 컴파일 에러가 발생합니다. 그렇기 때문에 모든 하위 클래스에 공통적으로 들어가는 로직이 있다면 static 혹은 default 메서드를 추하하여 손쉽게 처리할 수 있습니다.
public interface Phone {
    
    void call(String number);
    
    default void videoCall(String number) {
        System.out.println(number + "로 화상전화를 겁니다.");
    }
}

public class IPhone implements Phone {

    @Override
    public void call(String number) {
        System.out.println(number + "로 전화를 겁니다.");
    }
}

 

default 메서드의 사용은 어렵다.


  • 사용법만 놓고보면 default 키워드를 사용하여 모든 하위 클래스에서 사용이 가능합니다. 하지만 그렇게 쉬운 일만은 아닙니다. 
    디폴트 메서드는 구현 클래스에 대해서는 알지 못한채로 무작정 구현될 뿐만 아니라 이렇게 추가되는 default 메서드가 모든 상황에서 불변식을 해치지 않고 추가되는것은 어려운 일입니다.
  • 그렇기 때문에 default 메서드는 기존 인터페이스에 추가되는것은 피하고 새로운 인터페이스 생성시 선언하는것은 좋은거 같습니다.

 

💡정리

  • default 메서드는 인터페이스의 메서드 제거 및 기존 메서드의 시그니처 수정용이 아닙니다.
  • default 메서드는 구현 클래스에 공통으로 기능을 제공하는 만큼 문제가 발생한다면 역시 모든 구현 클래스에서 문제가 발생할 수 있습니다.
  • 새로운 인터페이스에서 작성하는 default 메서드는 표준 메서드를 제공하는 유용한 수단이 됩니다.

 

 

 

 

728x90
반응형