-
[더 자바8] 인터페이스 기본 메소드와 스태틱 메소드JAVA/JAVA8 관련 2022. 2. 13. 16:05
기본적으로 인터페이스에서는 추상메서드만 선언이 가능하였다.
JAVA8에서는 인터페이스에서 기본메소드와 스태틱 메소드를 선언할 수 있도록 변경되었다.
기본 메소드
- 인터페이스에 메소드 선인이 아니라 구현체를 제공하는 방식
- 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 존재함.
-> 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있는 위험이 존재
-> 반드시 문서화 필요(@implSpec 자바독 태그 사용)
- Object가 제공하는 기능 (equals, hasCode)는 기본 메소드로 제공할 수 없다.
(구현체가 재정의해야 함.)
- 본인이 수정할 수 있는 인터페이스에만 기본 메소드를 제공할 수 있다.
- 인터페이스를 상속받는 인터페이스에서 다시 추상 메소드로 변경할 수 있다.
- 인터페이스 구현체가 재정의 할수도 있다.
스태틱 메소드
- 해당 타입 관련 헬퍼 또는 유틸리티 메소드를 제공할 때 인터페이스에 스태틱 메소드를 제공할 수 있다.
예제
인터페이스
public interface Foo2 { void printName(); /** * @implSpec 이 구현체는 getName()으로 가져온 문자열을 대문자료 바꿔 출력한다. */ // 기본 메소드 default void printNameUpperCase() { System.out.println(getName().toUpperCase()); } // 스태틱 메소드 static void printAnything() { System.out.println("foo"); } String getName(); }
클래스
public class DefaultFoo2 implements Foo2{ String name; public DefaultFoo2(String name) { this.name = name; } @Override public void printName() { System.out.println("foo"); } @Override public String getName() { return this.name; } }
public class App2 { public static void main(String[] args) { Foo2 foo =new DefaultFoo2("jump"); // 메소드 foo.printName(); // 기본 메소드 foo.printNameUpperCase(); // 정적 메소드 Foo2.printAnything(); } }
'JAVA > JAVA8 관련' 카테고리의 다른 글
[더 자바8] Opitonal 소개 (0) 2022.04.05 [더 자바8] STREAM API (0) 2022.03.20 [더 자바 8] 메소드 레퍼런스 (0) 2022.02.13 [더 자바 8] 람다 표현식 (0) 2022.02.06 [더 자바 8] 함수형 인터페이스와 람다 표현식 (0) 2022.02.04