ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인터페이스 기본 메소드와 스태틱 메소드
    백기선(인프런 강의)/더 자바, Java 8 2020. 7. 8. 23:26
    반응형

    기본 메소드 (Default Methods)

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

     

    스태틱 메소드

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

     

    참고

     

     

     

    예제

    public class DefaultFoo implements Foo, Bar {
    
    	String name;
    
    	public DefaultFoo(String name) {
    		this.name = name;
    	}
    
    	@Override
    	public void printName() {
    		System.out.println(this.name);
    	}
    
    	@Override
    	public String getName() {
    		return this.name;
    	}
    
    	// Foo, Bar에서 printNameUpperCase가 같이 정의되어있기 때문에
        // 재정의해서 사용해야 한다.
    	@Override
    	public void printNameUpperCase() {
    		Bar.super.printNameUpperCase();
    	}
    
    }

     

    public interface Foo {
    
    	void printName();
    
    	/**
    	 * @impSpec
    	 * 이 구현체는 getName()으로 가져온 문자열을 대문자로 바꿔 출력한다.
    	 */
    	default void printNameUpperCase() {
    		System.out.println(getName().toUpperCase());
    	}
    	
    	//A default method cannot override a method from java.lang.Object 
    //	default String toString() {
    //		
    //	}
    	
    	
    
    	String getName();
    }

     

    public interface Bar{
    	/**
    	 * @impSpec
    	 * 이 구현체는 getName()으로 가져온 문자열을 대문자로 바꿔 출력한다.
    	 */
    	default void printNameUpperCase() {
    		System.out.println("Bar");
    	}
    	
    }

     

    반응형
Designed by Tistory.