(Java8) 자바 8에서 변경된 인터페이스(1) + 이펙티브 자바

2022. 11. 22. 16:49Java

반응형

자바 8 버전이 되면서 인터페이스에서도 변경이 생겼습니다.

 

대표적으로 눈에 띄는 것이 기본 메서드 지원(default method)과 static 메서드 지원이 있습니다.

 

이번 문서에서는 기본 문서와 static 메서드를 지원함으로써 가능한 것들에 대해 알아보려고 합니다.

 

 

🧑‍💻상속, 구현에 용이한 기본 메서드


public interface Foo {
    void sayHelloTo(String name);
}

 

sayHelloTo라는 추상 메서드를 가진 Foo 인터페이스가 있습니다.

 

그리고 이 클래스를 여럭 곳에서 상속받아, 이를 구현하고 있다고 생각해봅시다.

 

그럼 자바 8이전에는 다음과 같이 사용해야 했을 것입니다.

 

public class FooImpl implements Foo {
    @Override
    void sayHelloTo(String name) {
        System.out.println("Hello " + name);
    }
}

 

이처럼 Foo를 상속받고 있는 모든 클래스에서 오버라이딩을 해야 했습니다.

 

그렇기 때문에 Foo 인터페이스에 새로운 요구사항이 생겨 새로운 메서드가 추가됐을 때는

구현, 상속받고 있는 모든 클래스에서 재정의가 필요했습니다.

 

 

 

하지만 Default메서드가 인터페이스에서 사용 가능해지면서 이런 문제점을 쉽게 해결할 수 있게 됐습니다.

 

 

public interface Foo {
    default void sayHelloTo(String name) {
        System.out.println("Hello " + name);
    }
}

 

이렇게 인터페이스에서도 default 메서드를 구현함으로써 상속, 구현받는 인터페이스, 클래스에서

불필요한 재정의가 필요 없어진 것입니다.

 

 

하지만 이런 기본 메서드는 같은 이름의 메서드, 즉 오버로딩 상황에서 올바르게 동작하지 않을 수 있습니다.

그렇기에 @ImpleSpec 어노테이션을 활용한 문서화를 이용해서 이런 문제를 미연에 방지할 필요가 있습니다.

 

 

 

🧑‍💻이펙티브 자바,  Item 21 인터페이스는 구현하는 쪽을 생각해서 설계하라


기본 메서드에 대해 조금 더 공부하다보니 자연스럽게 이펙티브 자바와 연결되었습니다.

 

Item21에서 기본 메서드에 대해 언급을 하고 있으니 이 부분을 잠깐 정리해서 살펴보도록 합시다.

 

Item21을 한 줄로 요약하면 '기존 인터페이스에 완전 무결한 기본 메서드를 추가하는 일이란 어렵다' 정도일 것 같습니다.

디폴트 메서드는 인터페이스로부터 메서드를 제거하거나 기존 메서드의 시그니처를 수정하는 용도가 아님을 명심해야 한다.

 

 

하지만 어디까지나 기존의 인터페이스에 디폴트 메서드를 추가할 때의 문제이고,

새로운 인터페이스를 만드는 상황에서는 표준적인 메서드 구현을 제공하는 데 아주 유용한 수단이며, 인터페이스를 더 쉽게 구현해 활용할 수 있게끔 해준다고 합니다.

 

 

이렇듯 인터페이스의 디폴트 메서드는 장/단점이 확실히 존재하는 기능으로, 세심한 주의가 필요하며,

새로운 인터페이스에 추가할 경우에는 반드시 테스트를 거쳐야합니다.

 

 

반응형