모르지 않다는 것은 아는것과 다르다.

Java

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

채마스 2022. 2. 26. 00:44

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

    public interface Foo {
        void printName(); // abstract 가 생략된 것이다.

        // 기본 메소드
        default void printNameUpperCase() {
            System.out.println(getName().toUpperCase());
        }
        // static 메소드
        static void printAnything(){
            System.out.println("Foo");
        }

    }
  • 기본 메소드
    • 어떤 인터페이스가 있다고 했을때, 해당 인터페이스를 구현하는 인스턴스들에 공통적으로 제공해주고 싶은 기능이 있다면?
      • 모든 인스턴스에 그 기능을 추가해야한다. -> 번거롭다 -> 그래서 등장하게 된 것이 인터페이스 기본 메소드(Default Methods)다.
    • 인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법이다.
    • 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새 기능을 추가할 수 있다.
    • 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다.
      • 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다.
      • 반드시 문서화 할 것. (@implSpec 자바독 태그 사용)
    • Object 가 제공하는 기능 (equals, hasCode)는 기본 메소드로 제공할 수 없다.
      • 구현체가 재정의해야 한다.
    • 본인이 수정할 수 있는 인터페이스에만 기본 메소드를 제공할 수 있다.
    • 인터페이스를 상속받는 인터페이스에서 다시 추상 메소드로 변경할 수 있다.
    • 인터페이스 구현체가 재정의 할 수도 있다.
  • 스태틱 메소드
    • 해당 타입 관련 헬퍼 또는 유틸리티 메소드를 제공할 때 인터페이스에 스태틱 메소드를 제공할 수 있다.

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

Iterable의 기본 메소드

  • forEach()
  • spliterator()
  • ex>
  List<String> numbers = new ArrayList();
  numbers.add("one");
  numbers.add("two");
  numbers.add("thredd");
  numbers.add("four");

  //forEach
  numbers.forEach(s -> System.out.println(s));

  //spliterator
  Spliterator<String> spliterator = numbers.spliterator();
  Spliterator<String> spliterator2 = spliterator.trySplit() // 절반으로 쪼개진다.
  while(spliterator.tryAdvance(System.out::println));
  while(spliterator2.tryAdvance(System.out::println));

Collection의 기본 메소드

  • stream() / parallelStream()
  • removeIf(Predicate)
  • spliterator()
  • ex>
  List<String> numbers = new ArrayList();
  numbers.add("one");
  numbers.add("two");
  numbers.add("thredd");
  numbers.add("four");

  //stream
  numbers.stream()
      .map(String::toUpperCase)
      .filter(s -> s.startsWith("t")) // t로 시작하는 것만 필터링한다.
      .count();

  //removeIf
  numbers.removeIf(s -> s.startsWith("t")); // t로 시작하는 것들은 삭제한다.

Comparator의 기본 메소드 및 스태틱 메소드

  • reversed()
  • thenComparing()
  • static reverseOrder() / naturalOrder()
  • static nullsFirst() / nullsLast()
  • static comparing()
  • ex>
  Comparator<String> compareToIgnoreCase = String::compareToIgnoreCase;
  numbers.sort(compareToIgnoreCase.reversed().thenComparing())

REFERENCES

  • 백기선님의 더 자바, Java 8

'Java' 카테고리의 다른 글

제네릭  (0) 2022.02.26
접근 지정자  (0) 2022.02.26
상수와 리터럴  (0) 2022.02.26
람다 표현식  (0) 2022.02.26
내부 클래스  (0) 2022.02.26