본문 바로가기
Flutter & Dart

Flutter & Dart - Dart 에서의 커링(Currying)

by 방정맞은사람 2025. 1. 9.

커링(Currying)은 하나의 함수가 여러 매개변수를 받는 대신, 매개변수를 나누어 단계별로 받는 기법입니다. 이를 통해 함수 호출을 더 유연하게 작성할 수 있으며, 재사용성을 높이는 데 기여합니다. 여기에서는 Dart에서 커링을 구현하고 사용하는 방식을 예제로 설명합니다.


기본 커링 함수 구현

curry(Function f) => (a, {Iterable? args}) =>
  (args?.length ?? 0) > 1 ? f(a, args) : (b) => f(a, b);

코드 분석

  1. Function f:
    •   커링 대상이 되는 함수입니다. 예를 들어, (int a, int b) => a * b 같은 함수가 입력됩니다.
  2. 매개변수 a와 선택적 매개변수 args:
    •   a: 첫 번째 매개변수로 사용됩니다.
    •   args: 선택적 매개변수로, 여러 값을 한 번에 전달할 수 있습니다.
  3. 동작:
    •   args가 전달되고 그 길이가 1보다 크면 f(a, args)를 즉시 실행합니다.
    •   그렇지 않으면 (b) => f(a, b)를 반환합니다. 이는 첫 번째 매개변수를 고정하고 두 번째 매개변수를 받을 수 있는 새로운 함수입니다.

커링 함수 사용 예시

기본 사용 예제

final multiply = (int a, int b) => a * b;
final curryMultiply = curry(multiply);

final result = curryMultiply(2); // (b) => multiply(2, b)
print(result(3)); // 출력: 6

동작 설명

  1. curryMultiply(2):
    •   첫 번째 호출에서 a = 2로 전달됩니다.
    •   선택적 매개변수 args는 전달되지 않았으므로, (b) => f(a, b)를 반환합니다.
  2. result(3):
    •   반환된 함수 (b) => multiply(2, b)를 호출하며, 여기서 b = 3이 전달됩니다.
    •   결과적으로 multiply(2, 3)이 실행되고 6이 반환됩니다.

확장된 예시: Dart에서의 커링 활용

Dart에서는 커링을 활용하여 더 복잡한 로직도 간단하게 구현할 수 있습니다.

HTML 생성기

Function tag(String name) {
  return (String content) {
    return '<$name>$content</$name>';
  };
}

final h1 = tag('h1');
final p = tag('p');

print(h1('Hello World')); // 출력: <h1>Hello World</h1>
print(p('This is a paragraph.')); // 출력: <p>This is a paragraph.</p>

스타일 텍스트 생성기

Function(String) styledText(Color color, double fontSize) {
  return (String text) {
    return Text(
      text,
      style: TextStyle(color: color, fontSize: fontSize),
    );
  };
}

final redText = styledText(Colors.red, 18);
final blueText = styledText(Colors.blue, 24);

print(redText('This is red text.'));
print(blueText('This is blue text.'));

커링과 메서드 체이닝의 차이

메서드 체이닝

메서드 체이닝은 여러 메서드를 연속적으로 호출하여 데이터를 처리하는 방식입니다. Dart에서는 Iterable이나 Stream의 메서드 체이닝이 일반적입니다.

예시

final List<String> names = getAccounts()
  .map((account) => account.userId)
  .map((userId) => getUser(userId))
  .map((user) => user.name)
  .toList();
  •  여기서 각 메서드는 앞의 결과를 받아 다음 메서드로 넘깁니다.
  •  메서드 체이닝은 선언형 프로그래밍 방식으로 간결한 코드를 작성할 수 있게 합니다.

커링과의 차이

  • 커링: 함수의 매개변수를 나누어 여러 단계에 걸쳐 처리합니다.
  • 메서드 체이닝: 데이터 흐름을 여러 메서드로 연결하여 처리합니다.

요약

  1. 커링의 개념:
    •   여러 매개변수를 단계적으로 받아 처리하는 함수 프로그래밍 기법입니다.
  2. 커링의 장점:
    •   코드 재사용성을 높이고, 복잡한 함수를 간단히 구성할 수 있습니다.
  3. 메서드 체이닝과의 차이:
    •   커링은 함수의 매개변수 분리와 단계별 처리를 중심으로 합니다.
    •   메서드 체이닝은 데이터의 흐름과 처리 과정을 연결하는 데 초점이 있습니다.

커링을 활용하면 함수형 프로그래밍 기법을 이해하고 응용하는 데 매우 유용하며, 더 유연하고 간결한 코드를 작성할 수 있을겁니다!