본문으로 바로가기

인터페이스의 변화

category JAVA/JAVA8 2021. 1. 17. 01:41
반응형

인터페이스 기본 메소드와 스태틱 메소드

 

기본 메소드(Default Methods)

  • 인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법
  • 해당 인터페이스를 구현할 클래스를 깨트리지 않고 새 기능을 추가할 수 있다.
  • 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다.
    • 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다.
    • 반드시 문서화 할것. (@ImplSpec 자바독 태그 사용
  • Object가 제공하는 기능 (equals, hasCode)는 기본 메소드로 제공할 수 없다.
    • 구현체가 재정의해야 한다.
  • 본인이 수정할 수 있는 인터페이스에만 기본 메소드를 제공할 수 있다.
  • 인터페이스를 상속받는 인터페이스에서 다시 추상 메소드로 변경할 수 있다.
  • 인터페이스 구현체가 재정의 할 수도 있다.

스태틱 메소드

  • 해당 타입 관련 헬터 또는 유틸리티 메소드를 제공할 때 인터페이스에 스태틱 메소드를 제공할 수 있다.
public class App {
    public static void main(String[] args) {
        Foo foo = new DefaultFoo("Tistory");
        foo.printName();
        foo.printNameUpperCase();

        Foo.printAnything();
    }
}
public interface Foo {

    void printName();

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

    String getName();

    static void printAnything() {
        System.out.println("Foo");
    }

}
public interface Bar {

    default void printNameUpperCase() {
        System.out.println("BAR");
    }

}
public class DefaultFoo implements Foo, Bar {

    String name;

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

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

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

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

 

자바 8 API의 기본 메소드와 스태틱 메소드

public class App {
    public static void main(String[] args) {
        List<String> name = new ArrayList<>();
        name.add("Tistory");
        name.add("foo");
        name.add("toby");

        name.forEach(System.out::println);

        for (String n : name) {
            System.out.println(n);
        }

        Spliterator<String> spliterator = name.spliterator();
        Spliterator<String> stringSpliterator = spliterator.trySplit();

        System.out.println("===============");
        while(spliterator.tryAdvance(System.out::println));
        System.out.println("===============");
        while(stringSpliterator.tryAdvance(System.out::println));
        System.out.println("===============");

        name.stream().map(String::toUpperCase)
                .filter(s -> s.startsWith("K"))
                .collect(Collectors.toSet());


        name.removeIf(s -> s.startsWith("K"));

        name.forEach(System.out::println);

        Comparator<String> compareToIgnoreCase = String::compareToIgnoreCase;
    }
}
반응형

'JAVA > JAVA8' 카테고리의 다른 글

Stream  (0) 2021.01.17
함수형 인터페이스와 람다  (0) 2021.01.12