커링(Currying)은 하나의 함수가 여러 매개변수를 받는 대신, 매개변수를 나누어 단계별로 받는 기법입니다. 이를 통해 함수 호출을 더 유연하게 작성할 수 있으며, 재사용성을 높이는 데 기여합니다. 여기에서는 Dart에서 커링을 구현하고 사용하는 방식을 예제로 설명합니다.
기본 커링 함수 구현
curry(Function f) => (a, {Iterable? args}) =>
(args?.length ?? 0) > 1 ? f(a, args) : (b) => f(a, b);
코드 분석
- Function f:
- 커링 대상이 되는 함수입니다. 예를 들어, (int a, int b) => a * b 같은 함수가 입력됩니다.
- 매개변수 a와 선택적 매개변수 args:
- a: 첫 번째 매개변수로 사용됩니다.
- args: 선택적 매개변수로, 여러 값을 한 번에 전달할 수 있습니다.
- 동작:
- 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
동작 설명
- curryMultiply(2):
- 첫 번째 호출에서 a = 2로 전달됩니다.
- 선택적 매개변수 args는 전달되지 않았으므로, (b) => f(a, b)를 반환합니다.
- 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();
- 여기서 각 메서드는 앞의 결과를 받아 다음 메서드로 넘깁니다.
- 메서드 체이닝은 선언형 프로그래밍 방식으로 간결한 코드를 작성할 수 있게 합니다.
커링과의 차이
- 커링: 함수의 매개변수를 나누어 여러 단계에 걸쳐 처리합니다.
- 메서드 체이닝: 데이터 흐름을 여러 메서드로 연결하여 처리합니다.
요약
- 커링의 개념:
- 여러 매개변수를 단계적으로 받아 처리하는 함수 프로그래밍 기법입니다.
- 커링의 장점:
- 코드 재사용성을 높이고, 복잡한 함수를 간단히 구성할 수 있습니다.
- 메서드 체이닝과의 차이:
- 커링은 함수의 매개변수 분리와 단계별 처리를 중심으로 합니다.
- 메서드 체이닝은 데이터의 흐름과 처리 과정을 연결하는 데 초점이 있습니다.
커링을 활용하면 함수형 프로그래밍 기법을 이해하고 응용하는 데 매우 유용하며, 더 유연하고 간결한 코드를 작성할 수 있을겁니다!
'Flutter & Dart' 카테고리의 다른 글
Flutter & Dart - Isolates<in Dart> (2) | 2025.01.13 |
---|---|
Flutter & Dart - Functional Programming (함수형 프로그래밍) (3) | 2025.01.09 |
Flutter & Dart - Lambda (2) | 2025.01.08 |
Flutter & Dart - Iterable (0) | 2025.01.08 |
Flutter & Dart - Stream,StreamBuilder (2) | 2025.01.07 |