기존 인터페이스와 자바8의 인터페이스에는 큰  차이가 있다.

default method 와 static method 의 허용이 대표적인데 라이브러리들을 크게 변화시킨 default method에 대해 알아보자.

 

기존의 인터페이스

인터페이스

public interface OldInterface {

    void printHi();
    void printHello();
}

 

 

구현체

public class OldClass implements OldInterface{
    @Override
    public void printHi() {
        System.out.println("Hi");
    }

    @Override
    public void printHello() {
        System.out.println("Hello");
    }
}

 

 

인터페이스의 구현체들은 해당 인터페이스의 메서드를 모두 @Override 해야하였다.

 

따라서 인터페이스를 확장하게 된다면 해당 구현체들이 전부 깨지는 현상이 발생하게 된다.

 

그렇다면 과거의 라이브러리들은 어떻게 구현되었을까?

 

 

과거의 라이브러리

인터페이스

public interface OldInterface {

    void printHi();
    void printHello();
}

 

 

추상 클래스가 인터페이스를 받음

public abstract class OldLibrary implements OldInterface {
    @Override
    public void printHi() {
    }

    @Override
    public void printHello() {
    }
}

 

 

추상 클래스를 상속받아서 사용

public class OldClass extends OldLibrary{
    
    @Override
    public void printHello() {
        System.out.println("Hello");
    }
}

 

 

추상 클래스로 인터페이스를 받고 구현체는 해당 추상 클래스를 상속받아서 사용한다.

이러한 방법으로 인터페이스의 '모든' 메서드를 전부 @Override 하지 않아도 사용이 가능해졌다.

하지만 어디까지나 추상 클래스를 상속받았기 때문에 '추가로' 추상 클래스를 상속받을 수 없게 되었다.

 

실제로 과거 스프링이 이러한 방식으로 구현되었다.

 

 

Java 8 인터페이스

Java 8 인터페이스는 이러한 문제점을 default method 를 제공함으로써 해결하였다.

 

default method 로 인터페이스에 구현체도 제공할 수 있게 되었다

 

인터페이스에 default method 를 사용하여 구현체에서 편리하게 default method 를 구현하지 않을수도, 구현없이 사용할수도 있게 되었다.

 

기존에는 인터페이스 확장 시 해당 인터페이스를 구현한 클래스가 깨지지만 Java 8 의 인터페이스는 default method 로 구현체를 살리면서 기능을 확장 가능하다.

 

그리고 Object 가 제공하는 기능(equals, hashCode) 는 default 메서드로 제공불가능하다.

본인이 수정 가능한 인터페이스에만 default method 제공 가능하다.

 

 

해당 인터페이스를 상속받는 인터페이스에서 다시 추상메서드로 변경가능하며 구현체에서 재정의 또한 가능하다. 

 

 

Java 8 인터페이스

public interface NewInterface {
    default void printHi() {
        System.out.println("Hi");
    }

    default void printHello() {
        System.out.println("Hello");
    }
}

 

 

하지만 해당 구현체가 직접 default 메서드를 구현하지 않고 사용가능하기 때문에 잘못된 방법으로 사용 가능하다.

파라미터 타입이 안맞는다던지 하는 방법 등등..

 

그래서 보통 라이브러리들을 보면 주석으로 다 설명을 해야한다.

 

public interface NewInterface {

    /**
     * 설명설명설명
     */
    default void printHello() {
        System.out.println("Hello");
    }

    /**
     * 설명설명설명
     */
    default void printNumber(String number) {
        System.out.println(number);
    }
}

 

 

 

'Java > Java 8' 카테고리의 다른 글

Stream  (0) 2024.07.29
Optional 의 등장 배경과 주의 사항  (0) 2024.07.24
함수형 프로그래밍  (0) 2024.07.18