-
인터페이스 기본 메소드와 스태틱 메소드백기선(인프런 강의)/더 자바, Java 8 2020. 7. 8. 23:26반응형
기본 메소드 (Default Methods)
- 인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법
- 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새 기능을 추가할 수 있다.
- 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다.
- 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다.
- 반드시 문서화 할 것. (@implSpec 자바독 태그 사용)
- Object가 제공하는 기능 (equals, hasCode)는 기본 메소드로 제공할 수 없다.
- 구현체가 재정의해야 한다.
- 본인이 수정할 수 있는 인터페이스에만 기본 메소드를 제공할 수 있다.
- 인터페이스를 상속받는 인터페이스에서 다시 추상 메소드로 변경할 수 있다.
- 인터페이스 구현체가 재정의 할 수도 있다.
스태틱 메소드
- 해당 타입 관련 헬터 또는 유틸리티 메소드를 제공할 때 인터페이스에 스태틱 메소드를 제공할 수 있다.
참고
- https://docs.oracle.com/javase/tutorial/java/IandI/nogrow.html
- https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
예제
public class DefaultFoo implements Foo, Bar { String name; public DefaultFoo(String name) { this.name = name; } @Override public void printName() { System.out.println(this.name); } @Override public String getName() { return this.name; } // Foo, Bar에서 printNameUpperCase가 같이 정의되어있기 때문에 // 재정의해서 사용해야 한다. @Override public void printNameUpperCase() { Bar.super.printNameUpperCase(); } }
public interface Foo { void printName(); /** * @impSpec * 이 구현체는 getName()으로 가져온 문자열을 대문자로 바꿔 출력한다. */ default void printNameUpperCase() { System.out.println(getName().toUpperCase()); } //A default method cannot override a method from java.lang.Object // default String toString() { // // } String getName(); }
public interface Bar{ /** * @impSpec * 이 구현체는 getName()으로 가져온 문자열을 대문자로 바꿔 출력한다. */ default void printNameUpperCase() { System.out.println("Bar"); } }
반응형'백기선(인프런 강의) > 더 자바, Java 8' 카테고리의 다른 글
Stream 소개 (0) 2020.07.09 자바 8 API의 기본 메소드와 스태틱 메소드 (0) 2020.07.09 메소드 래퍼런스 (0) 2020.07.07 람다 표현식 (0) 2020.07.07 자바에서 제공하는 함수형 인터페이스 (0) 2020.07.07