[Dart] 리스트(List) 모든 요소를 하나의 값으로 만들기 - fold() 함수

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() 함수의 동작 원리

위 예제의 동작을 단계별로 살펴보겠습니다.

  1. acc = 0, element = 10 → 0 + 10 = 10
  2. acc = 10, element = 20 → 10 + 20 = 30
  3. acc = 30, element = 30 → 30 + 30 = 60
  4. 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()보다 더욱 안정적인 연산을 수행할 수 있습니다. 위에서 설명한 예제들을 직접 실행해 보면서 활용법을 익혀보세요!