728x90
인터페이스를 상속받은 클래스 혹은 인터페이스가 있을 때
추상메소드가 있다면 상속받고 재정의를 하게 된다.
그렇다면 새로운 기능을 상속하는 모든 존재들에게 작동되게 하고 싶다면 어떻게 해야할까?
방법은 기본 메소드를 이용하면 된다.
default void 메소드명(){
내부 기능
}
위처럼 메소드를 만들면 상속한 모든 존재들이 기본 메소드를 사용할 수 있게 된다.
코드를 보면서 더 생각해보자
기본 메소드를 갖고 있는 인터페이스 코드
package interface_change.fir;
public interface Foo {
void printName();
/*
* @implSpec
* 이 구현체는 getName()으로 가져온 문자열을 대문자로 출력한다.
*/
default void printNameUpperCase(){
System.out.println(getName().toUpperCase());
}
/*
* Object가 제공하는 기능은 재정의를 할 수 없다!!
* 컴파일 에러가 뜸
default void toString(){
}
*/
String getName();
}
** 주의
-object가 제공하는 기능은 재정의 할수 없다는 것이다!! (toString, equals ...)
인터페이스를 상속하는 클래스
package interface_change.fir;
public class DefaultFoo implements Foo{
String name;
public DefaultFoo(String name){
this.name = name;
}
/*
*재정의를 할 수도 있음
@Override
public void printNameUpperCase(){
System.out.println(this.name.toUpperCase());
}
*/
@Override
public void printName() {
System.out.println(this.name);
}
@Override
public String getName() {
return this.name;
}
}
** 주의
- 상속받은 인터페이스의 기본 메소드를 재정의할 수 있다.
클래스를 실행시키는 코드
package interface_change.fir;
public class App {
public static void main(String[] args) {
Foo foo = new DefaultFoo("hyeok");
foo.printName();
foo.printNameUpperCase();
}
}
/*
*출력값
hyeok
HYEOK
*/
만약에 기본 메소드를 갖고 있는 인터페이스를 상속받고 싶지만 기본 메소드의 기능을 구현하고 싶지 않을때는 어떻게 하면 될까??
정답은 !! 추상메소드로 만들어주면 된다.
코드
package interface_change.fir;
public interface Bar extends Foo{
// 기본 메서드로 제공되는 기능을 추상메소드로 바꿔준다
// 기존의 기능을 수행하지 않음
void printNameUpperCase();
}
마지막으로
같은 이름의 기본 메소드를 갖고 있는 두 인터페이스를 한 클래스가 동시에 상속받는다면 어떤 일이 일어날까???
-> 컴파일 에러가 발생한다
이유는 : 무슨 인터페이스를 더 우선으로 할지 아무도 모르기 때문이다.
결국 이를 해결하기 위해서는
클래스에서 재정의를 해야한다.
728x90
'자바' 카테고리의 다른 글
자바 8 stream API (0) | 2021.07.24 |
---|---|
자바 8 stream 기본 (0) | 2021.07.23 |
람다식 매소드 레퍼런스 (0) | 2021.07.13 |
함수형 인터페이스와 람다표현식 (0) | 2021.07.13 |
문자열 자르기 substring (0) | 2021.02.04 |
댓글