자바8 버전부터는 인터페이스에서 Default method와 Static method를 사용할 수 있습니다.
개인적으로는 클래스랑 인터페이스의 경계가 조금 허물어지는게 아닌가.. 하고 조금 의아하기도 했습니다.
하나씩 살펴봅시다.
Default method
기본 메소드(default method)는 interface에서 메서드 내용을 정의하고, 그대로 재사용할 수 있게 해줍니다.
public interface Printer {
String getName();
default void printNameUpperCase() {
System.out.println(getName().toUpperCase());
}
}
public class HoneyPrinter implements Printer {
@Override
public String getName() {
return "Honey";
}
}
Printer 인터페이스를 보시면, printNameUpperCase의 동작을 정의하고 있습니다. java8부터 default 키워드를 붙임으로써 가능합니다.
구현체는 인터페이스에서 default method로 정의한 메서드를 재사용할 수 있습니다. 그러면 이걸 왜 사용하는 걸까요?
- 자바는 다중 상속이 불가능합니다.
- 그래서 다중 상속 대신 인터페이스를 추가 구현합니다.
- 여기서 모든 인터페이스의 구현체에서 해당 메서드를 구현해야되는 문제가 발생합니다.
주의할 점은 구현체에서 인터페이스의 default method의 기능을 모른다는 점입니다. Effective Java에서는 인터페이스의 default method의 경우 반듭시 반드시 문서화를 하는 것을 권장합니다.
/**
* @implSpec
* 이 구현체는 getName()으로 가져온 문자열을 대문자로 바꿔 출력한다.
*/
default void printNameUpperCase() {
System.out.println(getName().toUpperCase());
}
Static method
Java8부터 interface도 클래스처럼 정적메서드를 정의할 수 있습니다. (static method는 구현체에서 재정의할 수 없습니다.)
public interface Printer {
static void printHello() {
System.out.println("hello");
}
}
아래와 같이 클래스의 정적메서드 사용하듯이 사용할 수 있습니다.
public static void main(String[] args) {
Printer.printHello();
}
마무리
Java8의 interface 변화는 자바를 자유도가 높은 언어로써 사용하기 위한 부분이라고 합니다!
감사합니다.
출처 : 더 자바, Java 8 - 인프런 백기선님 강의
'Language > Java' 카테고리의 다른 글
Java 8 - Optional이란? (0) | 2022.03.12 |
---|---|
Java 8 - Stream이란? (+ ParallelStream) (0) | 2022.03.11 |
Java - 람다(Lambda)의 멀티 쓰레드(multi-thread) [외부 변수를 final만 허용하는 이유] (0) | 2022.03.09 |
Java 8 - 함수형 인터페이스를 사용하는 방법! (0) | 2022.03.05 |
Java - 참조(reference) 객체가 아닌 값(value) 객체 사용하는 방법 (0) | 2022.03.05 |