[Java 8] 인터페이스의 default 메서드와 static 메서드

홍정완·2022년 6월 13일
0

Java

목록 보기
5/25
post-thumbnail

Java 8부터는 인터페이스에 추상 메서드 선언뿐만 아니라 구현체를 제공할 수 있다.




default 메서드


  • Java 8 이전에는 인터페이스에 추상 메서드가 추가되면 해당 인터페이스를 구현한 모든 클래스에서 다시 재정의를 해줘야 했다.

// Ex
public interface Print {

    void print();

}
public class Name implements Print {

    @Override
    public void print() {
        System.out.println("Name Class");
    }

}



  • 만약 인터페이스에 새로운 추상 메서드가 추가된다면 Print 인터페이스를 구현한 모든 클래스는 이를 구현해 줘야 한다.

    • 해당 인터페이스를 구현한 클래스가 많을수록 상당히 번거로워진다.

  • 구현하지 않을 시, 컴파일 에러 발생



  • 앞서 살펴본 문제점을 default 메서드를 활용하면 간단하게 해결

public interface Print {

    void print();

    default void printDefault() {
        System.out.println("print Default");
    }

}



특징 ✅


  • 해당 인터페이스를 구현한 클래스를 깨트리지 않고, 새로운 기능 추가 가능

  • 구현체에서 재정의 가능

    • 다중 상속한 인터페이스의 default 메서드가 중복되는 경우 메서드를 재정의해야 한다.

  • 특정 default 메서드를 제공하고 싶지 않은 경우, 다시 추상 메서드로 변경 가능

  • default 메서드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 있다.

    • 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있다.

    • 반드시 문서화할 것. (@implSpec 자바독 태그 사용)


  • Object가 제공하는 기능 (equals, hasCode)는 default 메서드로 제공할 수 없다.

    • 구현체가 재정의해야 한다.

  • 본인이 수정할 수 있는 인터페이스에만 default 메서드 제공 가능



static 메서드


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

public interface Print {

    static void printStatic() {
        System.out.println("print Static");
    }

}
public class App{

	public static void main(String[] args){
    	Print.printStatic();
    }

}
profile
습관이 전부다.

0개의 댓글