인터페이스 default 메소드와 static 메소드

구름코딩·2020년 9월 30일
0

java8 _ 더 자바

목록 보기
6/23

기본 메소드 default method

  • 인터페이스에 메소드 선언이 아니라 구현체를 바로 제공하는 방법
  • 해당 인터페이스를 구현한 클래스를 깨트리지 않고 새기능을 추가할 수 있다
  • 기본 메서드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다
    • 런타임에러가 발생할 수 있다
    • 반드시 문서화 해야한다 (impleSpec 자바독 태그 사용)
  • Object가 제공하는 기능 (equals, toString)은 기본 메서드로 제공할 수 없다
    • 구현체가 재정의 해야한다
  • 본인이 수정할 수 있는 인터페이스에만 기본메서드를 제공할 수 있다
  • 인터페이스를 상속받는 인터페이스에서 다시 추상 메서드로 변경할 수 있다
  • 상속받은 기본 메소드를 인터페이스 구현체가 재정의 할 수 있다
  • 하나의 클래스에서 두개의 인터페이스를 상속받는데 중복된 기본메소드가 있을 경우 필수적으로 재정의를 해야한다

스태틱 메소드 static method

  • 해당 타입 관련 헬터 또는 유틸리티 메소드를 제공할 때 인터페이스에 스태틱 메소드를 제공할 수 있다

코드

인터페이스 Foo, Bar

public interface Foo {

    void printName();

    // default 메소드
    // Foo 인터페이스를 상속받은 모든 클래스들은 디폴트 메서드를 사용할 수 있다
    default void printNameUpperCase(){
        System.out.println(getName().toUpperCase());
    }

    //static 메소드
    static void printAnything() {
        System.out.println("Foo");
    }

    String getName();
}

public interface Bar {

    default void printNameUpperCase(){
        System.out.println("BAR");
    };
}

구현체

public class DefaultFoo implements Foo, Bar{

    String name;

    public DefaultFoo(String name) {
        this.name = name;
    }

    // 두개의 인터페이스에서 중복돈 디폴트 메서드를 상속받는다면 오버라이드를 해야만한다
    //default Method도 재정의가 가능하다
    @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;
    }

    @Override
    public String toString() {
        return "my name is "+ this.name;
    }
}

Main

Foo foo = new DefaultFoo("woonsik");
foo.printName();
foo.printNameUpperCase(); // default Method


// 스태틱 메서드에 접근
// 해당 타입과 관련 헬터 또는 메소드를 제공할 때 인터페이스에 스태틱 메소드를 제공할 수 있다
Foo.printAnything();
profile
내꿈은 숲속의잠자는공주

0개의 댓글