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 의 변화가 있다.
반응형
'WEB > JAVA' 카테고리의 다른 글
Enum Type 에서 Function Interface 활용 (0) | 2022.04.01 |
---|---|
Test-Driven-Development 테스트 주도 개발 (0) | 2022.03.24 |
[MapStruct] 내가 찾아 쓰려고 정리한 글 (0) | 2022.03.16 |
[Lombok] Difference Between @Value and @Data (0) | 2022.03.11 |
내가 보려고 정리하는 JAVA 멀티 스레드 5- 스레드풀 (0) | 2021.10.06 |