인터페이스 기본 메소드
인터페이스에 있는 추상 메소드 -> 인터페이스를 implements 할 때 구현해야한다.
구현 완료된 후 인터페이스의 특정 메소드를 추가한다면? 해당 인터페이스의 모든 구현체에 컴파일 에러 발생!
인터페이스내에서 default 키워드를 사용하여 기본 메소드로 추가한다면 해당 기능을 구현하지 않아도 된다.
public interface Foo {
void printName();
String getName();
default void printNameUpperCase() {
System.out.println(getName().toUpperCase());
}
}
public class DefaultFoo implements Foo {
String name;
public DefaultFoo(String name) {
this.name = name;
}
@Override
public void printName() {
System.out.println(this.name);
}
@Override
public void getName() {
return this.name;
}
}
public class App {
public static void main(String[] args) {
Foo foo = new DefaultFoo("cy");
foo.printName(); //cy
foo.printNameUpperCase(); //CY
}
}
인터페이스 FOO를 구현한 DefaultFoo에서는 printNameUpperCase()에 대해 오버라이딩하지 않았지만, 해당 함수를 호출하여 사용할수 있다. 기본 메소드이기 때문!
근데 이런 기본 메소드를 어떻게 구현했는지 우리가 다 알 수 없다. 때에 따라 Runtime Exception이 발생할 위험이 있다. 따라서 해당 기본 메소드의 기능에 대해 @implSpec 자바독 태그를 사용하여 반드시 문서화하는 것이 좋다.
물론 구현체에서 기본 메소드를 오버라이딩하고 싶다면, 재정의할 수 있다.
Object에서 제공하는 메소드들은 (equals, hashCode, toString 등) 기본 메소드로 제공할 수 없고, 필수로 구현체가 재정의해야 한다.
만약 동일한 이름의 기본 메소드를 갖는 두개의 인터페이스를 모두 implements한다면, 어느 인터페이스의 메소드를 의미하는지 명확히할 수 없어 컴파일 에러가 발생한다. 이 때는 구현체가 해당 메소드를 오버라이딩하여 재정의해야한다.
인터페이스 스태틱 메소드
인터페이스 구현체들은 인스턴스가 사용할 수 있는거고, 해당 인터페이스를 구현한 모든 인스턴스 또는 해당 타입에 관련되어있는 어떤 유틸리티나 헬퍼 메소드를 제공하고싶은 경우에는 스태틱 메소드를 제공할 수 있다.
public interface Foo {
static void printFoo() {
System.out.println("Foo");
}
}
public class App {
public static void main(String[] args) {
Foo foo = new DefaultFoo("cy");
Foo.printFoo(); //Foo
}
}
이 포스팅은 더 자바, Java 8 강의를 수강하며 작성되었습니다.
더 자바, Java 8 강의 | 백기선 - 인프런
백기선 | 자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합
www.inflearn.com
'Java' 카테고리의 다른 글
[Java8] Stream (0) | 2024.07.28 |
---|---|
[Java8] Java8 API의 메소드 (0) | 2024.07.25 |
[Java8] 메소드 참조 (Method Reference) (0) | 2024.07.19 |
[Java8] 람다 표현식 (lambda) (0) | 2024.07.14 |
[Java8] 자바에서 제공하는 함수형 인터페이스 (1) | 2024.07.14 |