ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [더 자바8] 인터페이스 기본 메소드와 스태틱 메소드
    JAVA/JAVA8 관련 2022. 2. 13. 16:05

    기본적으로 인터페이스에서는 추상메서드만 선언이 가능하였다.

    JAVA8에서는 인터페이스에서 기본메소드와 스태틱 메소드를 선언할 수 있도록 변경되었다.

     

    기본 메소드

    - 인터페이스에 메소드 선인이 아니라 구현체를 제공하는 방식

    - 기본 메소드는 구현체가 모르게 추가된 기능으로 그만큼 리스크가 존재함.

        -> 컴파일 에러는 아니지만 구현체에 따라 런타임 에러가 발생할 수 있는 위험이 존재

        -> 반드시 문서화 필요(@implSpec 자바독 태그 사용)

    - Object가 제공하는 기능 (equals, hasCode)는 기본 메소드로 제공할 수 없다.

    (구현체가 재정의해야 함.)

    - 본인이 수정할 수 있는 인터페이스에만 기본 메소드를 제공할 수 있다.

    - 인터페이스를 상속받는 인터페이스에서 다시 추상 메소드로 변경할 수 있다.

    - 인터페이스 구현체가 재정의 할수도 있다.

     

    스태틱 메소드

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

     

    예제

    인터페이스

    public interface Foo2 {
    
        void printName();
        /**
         * @implSpec 이 구현체는 getName()으로 가져온 문자열을 대문자료 바꿔 출력한다.
         */
        // 기본 메소드
        default void printNameUpperCase() {
            System.out.println(getName().toUpperCase());
        }
        // 스태틱 메소드
        static void printAnything() {
            System.out.println("foo");
        }
        String getName();
    }

    클래스

    public class DefaultFoo2 implements  Foo2{
    
        String name;
    
        public DefaultFoo2(String name) {
            this.name = name;
        }
    
        @Override
        public void printName() {
            System.out.println("foo");
        }
    
        @Override
        public String getName() {
            return this.name;
        }
    }

     

    public class App2 {
    
        public static void main(String[] args) {
            Foo2 foo  =new DefaultFoo2("jump");
            // 메소드
            foo.printName();
            // 기본 메소드
            foo.printNameUpperCase();
            // 정적 메소드
            Foo2.printAnything();
        }
    }
Designed by Tistory.