본문 바로가기
자바

인터페이스 기본 메소드(Default Methods)

by 근즈리얼 2021. 7. 16.
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

댓글