PHpullh
학습 라이브러리/Java/커링(Currying)과 부분 적용

JAVA · 람다/메서드

커링(Currying)과 부분 적용

다중 인자 함수를 단일 인자 함수 체인으로 변환하는 커링 패턴입니다.

람다/메서드고급currying커링부분적용Function

핵심 설명

다중 인자 함수를 단일 인자 함수 체인으로 변환하는 커링 패턴입니다.

Java code

import java.util.function.*;

public class Currying {
    // 커링: (a, b) -> r 을 a -> (b -> r)로 변환
    static <A, B, R> Function<A, Function<B, R>> curry(
            BiFunction<A, B, R> f) {
        return a -> b -> f.apply(a, b);
    }

    // 부분 적용: 첫 번째 인자 고정
    static <A, B, R> Function<B, R> partial(
            BiFunction<A, B, R> f, A a) {
        return b -> f.apply(a, b);
    }

    public static void main(String[] args) {
        // 일반 BiFunction
        BiFunction<String, String, String> greet =
            (greeting, name) -> greeting + ", " + name + "!";

        // 커링
        Function<String, Function<String, String>> curriedGreet =
            curry(greet);
        Function<String, String> sayHello = curriedGreet.apply("Hello");
        System.out.println(sayHello.apply("Alice")); // Hello, Alice!
        System.out.println(sayHello.apply("Bob"));   // Hello, Bob!

        // 부분 적용
        Function<String, String> hiGreet = partial(greet, "Hi");
        System.out.println(hiGreet.apply("Charlie")); // Hi, Charlie!

        // 수학 예시
        BiFunction<Double, Double, Double> power = Math::pow;
        Function<Double, Double> square = partial(power, 2.0);
        Function<Double, Double> cube = partial(power, 3.0);
        // 주의: Math.pow(base, exp)이므로 partial은 base를 고정
    }
}

학습 팁

커링은 설정 패턴에 유용합니다. 데이터베이스 연결이나 로거 등 공통 인자를 먼저 바인딩하면 코드가 깔끔해집니다.

주의할 점

Java의 타입 시스템이 복잡해서 3개 이상의 인자 커링은 가독성이 떨어집니다. 2개까지만 사용하고 그 이상은 객체로 묶으세요.

자주 묻는 질문

커링(Currying)과 부분 적용란 무엇인가요?

다중 인자 함수를 단일 인자 함수 체인으로 변환하는 커링 패턴입니다.

커링(Currying)과 부분 적용 학습 시 주의할 점은 무엇인가요?

Java의 타입 시스템이 복잡해서 3개 이상의 인자 커링은 가독성이 떨어집니다. 2개까지만 사용하고 그 이상은 객체로 묶으세요.