FunctionalInterface — 함수형 인터페이스임을 나타내는 애너테이션
FunctionalInterface — 함수형 인터페이스임을 나타내는 애너테이션
@FunctionalInterface는 인터페이스 타입 선언이 JLS(Java Language Specification)에서 정의한 함수형 인터페이스(functional interface)이길 의도한다는 것을 나타내는 정보성(informative) 애너테이션 타입이에요.
본문
개념적으로 함수형 인터페이스는 정확히 하나의 추상 메서드(abstract method) 를 가져요. default 메서드는 구현이 있으므로 추상이 아니에요. 또 인터페이스가 java.lang.Object의 public 메서드 중 하나를 재정의하는 추상 메서드를 선언해도, 그 인터페이스의 추상 메서드 개수에는 세지 않아요 — 어차피 인터페이스의 어떤 구현이라도 Object나 다른 곳에서 온 구현을 갖게 되니까요.
함수형 인터페이스의 인스턴스는 람다 표현식, 메서드 참조, 생성자 참조로 만들 수 있어요.
이 애너테이션이 붙은 타입에 대해, 컴파일러는 다음 조건을 만족하지 않으면 에러 메시지를 내도록 요구돼요:
- 그 타입이 인터페이스 타입이고 애너테이션 타입·enum·클래스가 아닐 것
- 애너테이션이 붙은 타입이 함수형 인터페이스의 요건을 충족할 것
단, 컴파일러는 @FunctionalInterface 애너테이션이 없더라도 함수형 인터페이스 정의를 충족하는 인터페이스는 모두 함수형 인터페이스로 취급해요. 즉 이 애너테이션은 "명시적으로 의도를 선언"하는 도구이지, 함수형 인터페이스가 되기 위한 필수 조건은 아니에요.
정의는 다음과 같아요.
@Documented
@Retention(RUNTIME)
@Target(TYPE)
public @interface FunctionalInterface
자바 1.8부터 추가됐어요.