FunctionalInterface — 함수형 인터페이스임을 나타내는 애너테이션

FunctionalInterface — 함수형 인터페이스임을 나타내는 애너테이션

@FunctionalInterface는 인터페이스 타입 선언이 JLS(Java Language Specification)에서 정의한 함수형 인터페이스(functional interface)이길 의도한다는 것을 나타내는 정보성(informative) 애너테이션 타입이에요.

출처: Java API Reference

본문

개념적으로 함수형 인터페이스는 정확히 하나의 추상 메서드(abstract method) 를 가져요. default 메서드는 구현이 있으므로 추상이 아니에요. 또 인터페이스가 java.lang.Object의 public 메서드 중 하나를 재정의하는 추상 메서드를 선언해도, 그 인터페이스의 추상 메서드 개수에는 세지 않아요 — 어차피 인터페이스의 어떤 구현이라도 Object나 다른 곳에서 온 구현을 갖게 되니까요.

함수형 인터페이스의 인스턴스는 람다 표현식, 메서드 참조, 생성자 참조로 만들 수 있어요.

이 애너테이션이 붙은 타입에 대해, 컴파일러는 다음 조건을 만족하지 않으면 에러 메시지를 내도록 요구돼요:

  • 그 타입이 인터페이스 타입이고 애너테이션 타입·enum·클래스가 아닐 것
  • 애너테이션이 붙은 타입이 함수형 인터페이스의 요건을 충족할 것

단, 컴파일러는 @FunctionalInterface 애너테이션이 없더라도 함수형 인터페이스 정의를 충족하는 인터페이스는 모두 함수형 인터페이스로 취급해요. 즉 이 애너테이션은 "명시적으로 의도를 선언"하는 도구이지, 함수형 인터페이스가 되기 위한 필수 조건은 아니에요.

정의는 다음과 같아요.

@Documented
@Retention(RUNTIME)
@Target(TYPE)
public @interface FunctionalInterface

자바 1.8부터 추가됐어요.

더 알아보기 (Learn more)