1. 함수형 인터페이스 란?

단 하나의 추상 메서드만 가지는 인터페이스 (Java 8부터 함수형 프로그래밍을 지원하기 위해 도입)

 

 

2. 특징

  • 추상메서드가 하나 뿐인 인터페이스 (default 메서드나 static 메서드는 허용 됨.)
  • 람다 표현식으로 구현 가능
  • @FunctionalInterface 어노테이션을 사용하여 명시적으로 확인 가능
  • java.util.function 패키지에서 기본 함수형 인터페이스 제공
Consumer<T> 입력값을 받아서 처리하지만, 반환값은 없음

Consumer<String> print = (s) -> System.out.println(s);
Function<T, R> 입력값을 받아서 반환값을 생성

Function<String, Integer> length = (s) -> s.length();
Predicate<T> 조건을 검사하고 boolean 값을 반환

Predicate<String> isNotEmpty = (s) -> !s.isEmpty();
Supplier<T> 단순 값을 제공

Supplier<String> getString = () -> "Hello";

 

 

728x90

3. 사용 예시 

 함수형 인터페이스 생성

  • @FunctionalInterface : 함수형 인터페이스 임을 명시적으로 표현 (생략 가능)
  • run(String msg) : 유일한 추상 메서드
  • print1(String msg) : default 메서드 이므로 함수형 인터페이스로 선언하는 데에 지장 없음.
  • print2(String msg) : static 메서드 이므로 함수형 인터페이스로 선언하는 데에 지장 없음.
@FunctionalInterface
public interface MyFunction {
    void run(String msg);

    default void print1(String msg) {
        System.out.println(msg);
    }

    static void print2(String msg) {
        System.out.println(msg);
    }
}

 

 

 

함수형 인터페이스 구현

  • 출력: Functional Interface Test : Run!
public class FunctionalInterfaceExample {
    public static void main(String[] args) {
        MyFunction myFunction = (s) -> System.out.println("Functional Interface Test : " + s);
        myFunction.run("Run!"); 
    }
}

 

 

함수형 인터페이스 구현 + Bean 등록 간소화

@Configuration
public class MyConfig {

    @Bean
    public MyFunction<String, String> print() {
        return (s) -> System.out.println("Functional Interface Test : " + s);
    }
}

 

 

Stream API + java.util.function 패키지 사용

예시 : fruits List 에서 apple 인 항목만 추출하여 대문자로 출력하기

  • Predicate<String> : apple 인 항목인지 검증 (조건 판단)
  • Function<String, String> : 주어진 값을 대문자로 변환 (데이터 변환)
  • Consumer<String> : 주어진 값을 출력 (출력)
  • 출력 : Hello, APPLE
              Hello, APPLE
public class StreamExample {
    public static void main(String[] args) {
        List<String> fruits = Arrays.asList("apple", "banana", "orange", "apple");

        Predicate<String> isApple = (s) -> s.equals("apple");
        Function<String, String> toUpperCase = (s) -> s.toUpperCase();
        Consumer<String> printName = (name) -> System.out.println("Hello, " + name);

        fruits.stream()
            .filter(isApple)
            .map(toUpperCase)
            .forEach(printName);
    }
}

 

 

4. 결론

  • 함수형 인터페이스는 단 하나의 추상 메서드만 가진 인터페이스
  • 주로 람다 표현식과 함께 사용
728x90
반응형

'Java' 카테고리의 다른 글

DB의 동시성(Concurrency) 제어와 트랜잭션  (0) 2025.04.16

+ Recent posts