본문 바로가기
쿤즈 Dev/Java

[Java] 함수형 인터페이스 Functional Interface

by :)Koon 2023. 9. 22.

자바(Java)에서 정말 많이 사용하게 되는 인터페이스가 있다. 바로 함수형 인터페이스(Functional Interface)다.

이번 포스팅에서는 함수형 인터페이스에 대해서 알아보자.


함수형 인터페이스 Functional Interface

함수형 인터페이스는 Java 8에서 도입된 중요한 개념 중 하나이다. 함수형 인터페이스는 하나의 추상 메서드만을 가지는 인터페이스로, 자바에서 함수형 프로그래밍을 지원하는 데 사용된다. 이 개념은 람다 표현식 및 스트림 API와 같은 자바 8의 기능이 함께 사용된다.

 

함수형 인터페이스의 주요 특징과 목적은 다음과 같다


단 하나의 추상 메서드

함수형 인터페이스는 반드시 하나의 추상 메서드만을 가진다. 그 외 디폴트 메서드(default method)나 정적 메서드(static method)는 여러 개 가질 수 있지만, 추상 메서드는 오직 하나여야 한다.

 

람다 표현식

함수형 인터페이스는 람다 표현식을 통해 인스턴스화 할 수 있다. 이를 통해 함수를 변수로 저장하고 전달할 수 있으므로, 함수형 프로그래밍 스타일의 코드를 작성할 수 있다.

 

스트림(Stream) API와 함께 사용

자바 8의 스트림(Stream) API는 함수형 인터페이스와 함께 사용하여 데이터 컬렉션을 처리하는 데 유용하다. 예를 들어, 컬렉션의 요소를 필터링, 매핑, 정렬하는 등의 작업을 간결하게 처리할 수 있다.


함수형 인터페이스는 자바에서 더 간결하고 가독성 있는 코드를 작성하는 데 도움이 된다. 'java.util.function' 패키지에는 자주 사용되는 다양한 함수형 인터페이스가 포함되어 있으며, 이를 사용하여 함수형 스타일의 코드를 작성할 수 있다. 몇 가지 주요 함수형 인터페이스의 예는 다음과 같다.

  • Consumer<T>: 인자를 받아서 어떤 동작을 수행하는 함수를 나타낸다.
  • Supplier<T>: 어떤 값을 제공하는 함수를 나타낸다.
  • Function<T, R>: 하나의 인자를 받아서 다른 타입과 결과를 반환하는 함수를 나타낸다.
  • Predicate<T>: 인자를 받아서 조건을 검사하여 논리값을 반환하는 함수를 나타낸다.

함수형 인터페이스 예제

간단한 예제로 함수형 인터페이스를 사용하는 방법을 알아보자. 우선 함수형 인터페이스 하나를 만들어 보자.

@FunctionalInterface
public interface PrintFunction<T> {
    void println(T value);
}

함수형 인터페이스임을 알리는 '@FuntionalInterface' 어노테이션을 붙여주고 추상 메서드 하나를 만들어 준다. 이 메서드는 제너릭으로 되어 있으며 'print' 메서드를 가지고 있고, 출력할 인자를 받는다.

 

public class FunctionalMain {
    public static void main(String[] args) {
        PrintFunction<String> printer = value -> System.out.println(value);

        printer.println("함수형 인터페이스 출력!");
    }
}

메인메서드에서 함수형 인터페이스를 선언할 때 사용 방법은 () -> () 형태로 만들어 준다. 인자 하나를 받아서 처리할 구문을 작성한다. 이 식은 람다 표현식으로도 더 간단하게 줄일 수 있다.

public class FunctionalMain {
    public static void main(String[] args) {
        PrintFunction<String> printer = System.out::println;

        printer.println("함수형 인터페이스 출력!");
    }
}

함수형 인터페이스는 특히 스트림 API를 처리하는데 자주 사용된다. 현재 자바에서는 스트림 API와 함수형 인터페이스, 그리고 람다 표현식까지 매우 자주 사용되니 필히 익숙해져야 할 필요가 있다.

댓글