728x90
public interface Human{
void hName();
void hAge();
}
hName()과 hAge()라는 추상메소드를 두개를 가지고 있는 Human 인터페이스가 있습니다.
public class TestHuman implements Human {
@Override
public void hName(){
System.out.println("Kim");
};
}
그 interface를 상속하는 class TestHuman이 있습니다.
여기서 이 class는 에러가 납니다. 그 이유는 추상메소드 두개를 모두 override 하지 않았기 때문입니다.
여기서 override를 하지않아도 에러가 나지않으며 interface를 상속받은 클래스들이 모두 기본적으로 사용할 수 있도록 하는 것을 기본 메소드 라고합니다.
기본 메소드는 interface에서 만듭니다.
public interface Human{
void hName();
default void hAge(){
System.out.println("34");
}
}
기본 메소드로 만들고 싶은 메소드 앞에 default를 추가해줍니다. 그리고 여기서 메소드의 기능을 만들어줍니다.
public class TestHuman implements Human {
@Override
public void hName(){
System.out.println("Kim");
};
}
이 클래스에서의 오류가 사라집니다.
public class TestHuman implements Human {
@Override
public void hName(){
System.out.println("Kim");
};
@Override
public void hAge(){
System.out.println("22");
};
}
물론 재정의도 가능합니다.
public class Main{
public static void main(String[] args){
Human human = new TestHuman();
human.hAge();
}
}
//실행 결과
34
기본 메소드이기 때문에 바로 사용이 가능합니다.
public interface Human{
void hName();
default void hAge(){
System.out.println(Integer.toString(getAge()));
}
int getAge();
}
인테페이스 기본 메소드에는 생성자를 이용할 수도 있고, 메소드를 사용할 수도 있습니다.
스태틱 메소드도 있습니다.
public interface Human{
void hName();
default void hAge(){
System.out.println(Integer.toString(getAge()));
}
int getAge();
static void hState(){
System.out.println("휴식중");
}
}
public class Main{
public static void main(String[] args){
Human human = new TestHuman();
Human.hState();
}
}
//실행 결과
휴식중
일반 메소드와 다르게 interface의 타입을 가지고 호출해서 사용이 가능합니다.
728x90
'Back-End > JAVA' 카테고리의 다른 글
Predicate<T> interface (0) | 2021.04.29 |
---|---|
자바8 Function<T,R> interface (0) | 2021.04.26 |
자바 indexOf() - 문자열 중 해당문자 위치 찾기 (0) | 2021.04.07 |
자바 charAt(int i) -'0' 에 대해서 문자를 정수형으로? (0) | 2021.04.05 |
자바8 - 함수형 인터페이스와 람다 표현식에 대해서 간단하게 (0) | 2021.04.04 |