기본 메소드(Dafault Methods)
인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법
해당 인터페이스를 구현한 클래스를 깨뜨리지 않고 새 기능을 추가할 수 있음
기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있음
컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있음
반드시 문서화 해야함(@impleSpec 태그 사용)
ex)
public interface Foo{
void printName();
/**
* @impleSpec
* 이 구현체는 getName()으로 가져온 문자열을 대문자로 바꿔 출력한다
*/
default void printNameUpperCase(){
System.out.println(getName().toUpperCase());
}
}
Object가 제공하는 기능(equals, hasCode)은 기본 메소드로 제공할 수 없음
본인이 수정할 수 있는 인터페이스에만 기본 메소드를 제공할 수 있음
인터페이스를 상속받는 인터페이스에서 다시 추상 메소드로 변경할 수 있음
인터페이스 구현체가 재정의 할 수도 있음
스태틱 메소드
자바 8에서 추가한 기본 메소드로 인한 API 변화
Iterable의 기본 메소드
forEach()
spliterator() => 병렬 처리에 유용(나눠서 처리할 수 있기 때문)
Spliterator<String> spliterator = name.spliterator();
Spliterator<String> spliterator1 = spliterator.trySplit(); //spliterator가 반으로 잘리고, 나머지 반이 해당 변수에 들어감
while(spliterator.tryAdvance(System.out::println));
while(spliterator1.tryAdvance(System.out::println));
Collection의 기본 메소드
stream() / parallerlStream()
removeIf(Predicate)
name.removeIf(s->s.startWith("k"));
name.forEach(System.out::println); //k포함하는 값 제거
spliterator()
Comparator의 기본 메소드 및 스태틱 메소드
reversed()
thenComparing() //다른 조건으로 정렬
static reverseOrder() / naturalOrder()
static nullsFirst() / nullsLast()
static comparing()
Comparator<String> compareToIgnoreCase= String::compareToIgnoreCase;
name.sort(compareToIgnoreCase.reversed()); //역순
name.forEach(System.out::println);