본문 바로가기

BackEnd/Java&Spring

함수형 인터페이스 (Functional Interface)

Java에서 함수형 인터페이스는

단일 추상 메서드(Single Abstract Method, SAM)를 가진 인터페이스다.

 

Java 8 이상에서는 람다 표현식 및 함수형 인터페이스를 지원한다.

 

함수형 인터페이스의 추상 메서드 시그니처는 람다 표현식과 연관이 있다.

(추상 메서드 시그니처는 해당 함수형 인터페이스가 나타내는 함수의 형태를 결정하는 것)

 

java.util.function 패키지에는 다양한 함수형 인터페이스가 포함되어 있음.

Consumer 인터페이스의 추상 메서드는 다음과 같다.

 

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

 

여기서 accept가 추상 메서드이다.

이 메서드는 하나의 매개변수를 받고 반환값이 없츰. (함수형 인터페이스)

이렇게 정의된 인터페이스는 람다 표현식으로 표현할 수 있다.


@FunctionalInterface 어노테이션

해당 인터페이스가 함수형 인터페이스임을 나타내며, 컴파일러가 이 규칙을 체크하도록 함.

함수형 인터페이스의 추상 메서드 시그니처를 알면

그 인터페이스를 람다 표현식으로 표현할 때

필요한 매개변수 타입 및 반환 타입을 이해할 수 있음.

 

함수형 프로그래밍에서는 함수를 값으로 취급하고, 이러한 값은 해당 함수의 시그니처에 따라 동작한다능.

 

@FunctionvalInterface 어노테이션에 대해 자바 공식 문서 내용을 좀 더 다뤄보겠다.

 

Conceptually, a functional interface has exactly one abstract method. Since default methods have an implementation, they are not abstract. If an interface declares an abstract method overriding one of the public methods of java.lang.Object, that also does not count toward the interface's abstract method count since any implementation of the interface will have an implementation from java.lang.Object or elsewhere.

 

핵심은 함수형 인터페이스는 단 하나의 추상 메서드만 가져야 한다.

즉, 기본 메서드는 오버라이딩한 것을 포함하여 함수형 인터페이스 내에서 사용이 가능하다.

그리고 java.lang.Object에 구현된 다른 인터페이스도 사용 가능하다.

왜냐면, 어딘가에는 구현되어 있기 때문이잖슴~