[Java 8] 인터페이스의 변화(기본 메서드와 스태틱 메서드)

자바 8부터 인터페이스의 변화로 기본 메서드와 스태틱 메서드가 추가 되었다.

인터페이스를 구현할때 공통적으로 제공해줬으면 하는 특정한 기능들이 필요되면서 추가된 것이다.

인터페이스를 상속받으면 인터페이스에 정의된 메서드들은 모두 구현이 돼야 한다. 하지만 구현이 안되어도 괜찮고, 그냥 특정한 기능만 있게 할수있도록 변화되었다.

기본 메서드(default method) 사용예제와 제약사항

public interface InterfaceChangeStudy {
    void printName(); //인터페이스에 정의된 메서드는 모두 public

    //기본 메서드
    default void printNameUpperCase() {
        System.out.println(getName().toUpperCase());
    }

    String getName();
}

public class InterfaceChangeStudyClass implements InterfaceChangeStudy {
    String name;

    public InterfaceChangeStudyClass(String name) {
        this.name = name;
    }

    @Override
    public void printName() {
        System.out.println(this.name);
    }

    @Override
    public String getName() {
        return this.name;
    }
}

public class InterfaceStudyApp {
    public static void main(String[] args) {
        InterfaceChangeStudy study = new InterfaceChangeStudyClass("hyunsu");
        study.printName(); //hyunsu
        study.printNameUpperCase(); //HYUNSU
    }
}

InterfaceChangeStudy 인터페이스에서 printNameUpperCase() 메서드가 기본 메서드이다. 인터페이스에서 구현체를 제공하는것이다. 그러나 이 구현체가 항상 정상적으로 작동한다는 보장이 없다 위 예제에서도 name이 Null이면 에러가 발생한다. 그래서 @implSpec 자바독 태그를 사용하여 문서화를 반드시 해야 한다.

/**
 *@implSpec이 구현체는getName()으로 가져온 문자열을 대문자로 바꿔 출력한다.
 */
default void printNameUpperCase() {
    System.out.println(getName().toUpperCase());
}

실제로 사용시 문제가 발생하였을때 저 기본 메서드를 재정의 할 수 있다.

@Override
public void printNameUpperCase() {
    System.out.println(this.name.toUpperCase());
}

또 제약 사항으로 Object가 제공 하는기능은 기본 메서드로 제공할수 없으며 구현체가 재정의해야만 한다.

또 한가지 제약사항으로 같은 이름을 가진 기본 메서드를 가진 인터페이스를 둘다 상속했을때 에러가 발생한다.

스태틱 메서드(static method) 사용방법

인터페이스에서 스태틱 메서드가 제공된다.

public interface InterfaceChangeStudy {
    static void printInterfaceName() {
        System.out.println("InterfaceChangeStudy");
    }

}

public class InterfaceStudyApp {
    public static void main(String[] args) {
        InterfaceChangeStudy.printInterfaceName(); //InterfaceChangeStudy
    }
}

참조 : 백기선 더 자바, Java 8 인프런 강의, https://www.inflearn.com/course/the-java-java8

인터페이스를 구현할때 공통적으로 제공해줬으면 하는 특정한 기능들이 필요되면서 추가된 것이다.

인터페이스를 상속받으면 인터페이스에 정의된 메서드들은 모두 구현이 돼야 한다. 하지만 구현이 안되어도 괜찮고, 그냥 특정한 기능만 있게 하게 변경되었다. 그것이 기본 메서드 이다.

기본 메서드(default method) 사용예제와 제약사항

public interface InterfaceChangeStudy {
    void printName(); //인터페이스에 정의된 메서드는 모두 public

    //기본 메서드
    default void printNameUpperCase() {
        System.out.println(getName().toUpperCase());
    }

    String getName();
}

public class InterfaceChangeStudyClass implements InterfaceChangeStudy {
    String name;

    public InterfaceChangeStudyClass(String name) {
        this.name = name;
    }

    @Override
    public void printName() {
        System.out.println(this.name);
    }

    @Override
    public String getName() {
        return this.name;
    }
}

public class InterfaceStudyApp {
    public static void main(String[] args) {
        InterfaceChangeStudy study = new InterfaceChangeStudyClass("hyunsu");
        study.printName(); //hyunsu
        study.printNameUpperCase(); //HYUNSU
    }
}

InterfaceChangeStudy 인터페이스에서 printNameUpperCase() 메서드가 기본 메서드이다. 인터페이스에서 구현체를 제공하는것이다. 그러나 이 구현체가 항상 정상적으로 작동한다는 보장이 없다 위 예제에서도 name이 Null이면 에러가 발생한다. 그래서 @implSpec 자바독 태그를 사용하여 문서화를 반드시 해야 한다.

/**
 *@implSpec이 구현체는getName()으로 가져온 문자열을 대문자로 바꿔 출력한다.
 */
default void printNameUpperCase() {
    System.out.println(getName().toUpperCase());
}

실제로 사용시 문제가 발생하였을때 저 기본 메서드를 재정의 할 수 있다.

@Override
public void printNameUpperCase() {
    System.out.println(this.name.toUpperCase());
}

또 제약 사항으로 Object가 제공 하는기능은 기본 메서드로 제공할수 없으며 구현체가 재정의해야만 한다.

또 한가지 제약사항으로 같은 이름을 가진 기본 메서드를 가진 인터페이스를 둘다 상속했을때 에러가 발생한다.

 

스태틱 메서드(static method) 사용방법

인터페이스에서 스태틱 메서드가 제공된다.

public interface InterfaceChangeStudy {
    static void printInterfaceName() {
        System.out.println("InterfaceChangeStudy");
    }

}

public class InterfaceStudyApp {
    public static void main(String[] args) {
        InterfaceChangeStudy.printInterfaceName(); //InterfaceChangeStudy
    }
}

참조 : 백기선 더 자바, Java 8 인프런 강의, https://www.inflearn.com/course/the-java-java8

댓글

Designed by JB FACTORY