WEB/JAVA

Java 8 Interface - default 메서드, static 메서드

Java 8 이후로 interface에 대한 정의가 몇가지 변경되었다. 

 

상황 

이미 만들어져 있는 Interface 에 기능을 추가 하고 싶다. 하지만 이 Interface를 implemnets 받고 있는 class 모두가 이 기능의 구현체를 생성해야만 한다. 

 

default 메서드

인터페이스가 default 키워드로 선언되면 메서드를 구현할 수 있게 된다. -> 구현체들은 오버라이딩이 가능하다.

package com.example.demo;

public interface UserService {
  
  String getName(Long userId);
  
  int getAge(Long userId);
  
  /**
   * @implSpec 이 구현체는 주소를 반환한다.
   * @param userId
   * @return
   */
  // 이 부분은 구현체에서 구현하지 않아도 된다.
  default String getUserAddress(Long userId){
    return getName(userId) + "의 주소는 ";
  }

}
package com.example.demo;


public class UserServiceImpl implements UserService {

  @Override
  public String getName(Long userId) {
    return "";
  }

  @Override
  public int getAge(Long userId) {
    return 0;
  }

  // 재정의 가능
  @Override
  public String getUserAddress(Long userId) {
    return userId + "의 주소는 없을 것임 계소옥";
  }
  
  // static 메서드
  static void anyPrint() {
    System.out.println("anyPrint");
  }
}

주의해야하는 점

- 이렇게 생성된 메서더는 구현체가 모르게 추가된 기능으로 NPE 라던지 알 수 없는 에러가 생길 수 있다. 

- 사용하게될 경우 문서화 필수 (@implSpec)

- 같은 구현체를 정의한 Interface 2개 를 implemnts 받은 경우 컴파일 에러가 나기 떄문에 재정의 해주어야 한다.

( 이런 경우가 생길까? 🤔 )

 

static 메서드

  public static void main(String[] args) {
    UserService.anyPrint();
  }

 

위에서 정의한것과 같이 static 을 메서드에 붙여줄 수 있다. 바로 UserService Interface 를 호출하여 사용 가능하다.

 

이렇게 추가된 default 메서드로 인해 JAVA API 의 변화가 있다.