The Java8(인터페이스 - Default 메소드와 Static 메소드)
인터페이스 Default 메소드와 Static 메소드
인터페이스 기본 메소드와 스태틱 메소드
자바 8 이전에는 ..
public interface Hi{
void printName();
}
Hi 라는 인터페이스 생성
public class DefaultHi implement Hi{
@Override
public void printName(){
System.out.println("DefaultHi");
}
}
Hi라는 인터페이스를 구현한 DefaultHi 클래스
이런식으로 구현하고 사용하는 중 인터페이스에 또 다른 기능을 추가하고 싶다..
어떻게 해야할까 ?
public interface Hi{
void printName();
void printNameUpperCase(); // 추가
}
무작정 인터페이스에 메소드(printNameUpperCase() )를 추가해 보았다.
해당 인터페이스를 구현하는 모든 클래스들은 Error가 뜬다. (컴파일 에러)
에러 내용 : 대충 인터페이스 구현을 다 안했다는 내용
Class ‘DefautlHi’ must either be declared abstract or implement abstract method ‘printNameUpperCase()’ in ‘Hi’
해결법 ?
Java 8에서 업데이트된 “default” 키워드가 해결해 줄 수 있다.
기본 메소드 (Default Methods) 특징
- 인터페이스에 메소드 선언이 아니라 구현체를 제공하는 방법
- 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새 기능을 추가할 수 있다.
public interface Hi{
void printName();
//defautlt 키워드를 사용하면 인터페이스에서도 구현체를 작성할 수 있다.
default void printNameUpperCase(){
System.out.println(getName.)
}
}
- 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다.
- 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다.
- 반드시 문서화 할 것. (@implSpec 자바독 태그 사용)
- Object가 제공하는 기능(toString,equals, hasCode)은 기본 메소드로 제공할 수 없음
- 구현체는 재정의해야 한다.
//toString
default String toString() {
}
Tip. 선언은 가능하다.
String toString();