1. Dart의 fold() 함수란?
Dart에서 fold() 함수는 리스트의 모든 요소를 하나의 값으로 축약하는 기능을 합니다. reduce() 함수와 비슷하지만, fold()는 초기값을 설정할 수 있다는 점에서 차이점이 있습니다. 이 초기값은 연산을 수행할 때 첫 번째 요소로 사용됩니다.
2. fold() 함수의 사용법
List<int> numbers = [10, 20, 30, 40];
int sum = numbers.fold(0, (acc, element) => acc + element);
print(sum); // 100
매개변수 설명
- 초기값: fold(0, ...)에서 0은 초기값으로, 연산의 시작값이 됩니다.
- acc: 이전 연산의 결과값 (누적 값, accumulator)
- element: 현재 처리 중인 리스트의 요소
위 코드에서는 리스트 [10, 20, 30, 40]의 모든 요소를 더하여 100을 반환합니다.
3. fold() 함수의 동작 원리
위 예제의 동작을 단계별로 살펴보겠습니다.
- acc = 0, element = 10 → 0 + 10 = 10
- acc = 10, element = 20 → 10 + 20 = 30
- acc = 30, element = 30 → 30 + 30 = 60
- acc = 60, element = 40 → 60 + 40 = 100
최종적으로 100이 반환됩니다.
4. 다양한 예제
4.1 곱셈 연산 적용
List<int> numbers = [2, 3, 4];
int product = numbers.fold(1, (acc, element) => acc * element);
print(product); // 24
4.2 문자열 연결
List<String> words = ["Dart", "is", "awesome"];
String sentence = words.fold("", (acc, element) => "$acc $element").trim();
print(sentence); // Dart is awesome
4.3 리스트 변환 (객체 리스트에서 특정 값 추출)
void main() {
List<User> users = [User("Alice", 25), User("Bob", 30)];
int totalAge = users.fold(0, (acc, user) => acc + user.age);
print(totalAge); // 55
}
class User {
String name;
int age;
User(this.name, this.age);
}
5. fold() 사용 시 주의점
5.1 빈 리스트 처리 가능
fold() 함수는 빈 리스트에서도 안전하게 사용할 수 있습니다. 초기값이 제공되므로 예외가 발생하지 않습니다.
List<int> emptyList = [];
int sum = emptyList.fold(0, (acc, element) => acc + element);
print(sum); // 0
5.2 reduce()와의 차이점
fold()와 reduce()의 가장 큰 차이점은 초기값 제공 여부입니다. reduce()는 첫 번째 요소를 초기값으로 사용하지만, fold()는 사용자가 명시적으로 초기값을 설정할 수 있습니다.
함수 | 초기값 제공 | 빈 리스트 처리 |
reduce() | 초기값 없음 | 예외 발생 |
fold() | 초기값 제공 | 안전하게 처리 |
6. 마무리
Dart의 fold() 함수는 리스트의 모든 요소를 특정한 값으로 축약할 때 강력한 기능을 제공합니다. 특히 초기값을 설정할 수 있다는 점에서 reduce()보다 더욱 안정적인 연산을 수행할 수 있습니다. 위에서 설명한 예제들을 직접 실행해 보면서 활용법을 익혀보세요!