[Dart] fold 함수, for문을 다르게 사용하는 방법 (flutter)

"리스트의 모든 숫자 더하기", "장바구니의 총금액 계산하기"...

코딩을 하다 보면, 리스트(List)에 담긴 여러 데이터를 조합하여 하나의 결과를 만들어 내야 할 때가 정말 많습니다. 가장 먼저 떠오르는 방법은 역시 for 반복문입니다. 하지만 for문은 코드를 길게 만들고, 때로는 가독성을 해치기도 합니다.

만약 이 모든 과정을 단 한 줄의 코드로, 훨씬 우아하고 명확하게 처리할 수 있다면 어떨까요?

이에 대한 하나의 답변으로 오늘, fold 함수에 대해 알아보겠습니다.

fold 함수, 대체 뭔가요?

fold는 이름 그대로 리스트의 항목들을 차곡차곡 '접어서' 하나의 최종 결과값으로 만들어내는 함수입니다. (fold는 '접다'라는 뜻을 가지고 있죠? '갤럭시 폴드'가 접히는 휴대폰이잖아요~!)

'빈 상자에 물건을 하나씩 담아 정리하는 과정'을 상상하면 쉽습니다. 빈 상자에서 시작해서, 물건(리스트의 항목)을 하나씩 확인하며 상자에 넣고, 최종적으로 물건이 모두 담긴 상자(최종 결과) 하나를 남기는 것과 같습니다.

실전 예제: 장바구니 총금액 계산하기

온라인 쇼핑몰을 개발 중이고, 사용자의 장바구니에 담긴 모든 상품의 총액을 계산해야 하는 흔한 과제가 주어졌다고 상상해 봅시다. for문을 사용하면 아마 이렇게 코드를 작성할 것입니다.

// 간단한 상품 클래스
class CartItem {
  String name;
  int price;
  CartItem(this.name, this.price);
}

// 장바구니 데이터
final items = [
  CartItem('신발', 120000),
  CartItem('티셔츠', 35000),
  CartItem('바지', 78000),
];

// for문을 사용한 방식
var total = 0; // 1. 합계를 저장할 외부 변수가 필요하다.
for (final item in items) { // 2. 모든 상품을 하나씩 꺼낸다.
  total = total + item.price; // 3. 외부 변수에 계속 더해나간다.
}

print(total); // 결과: 233000

코드가 길지는 않지만, 합계를 저장할 total 변수를 외부에 선언하고 관리해야 합니다. fold를 사용하면 이 모든 과정이 단 한 줄로 압축 할 수 있답니다. 😋

// fold를 사용한 방식
final total = items.fold(0, (currentTotal, item) => currentTotal + item.price);

print(total); // 결과: 233000

이 한 줄의 코드가 어떻게 위 for문과 똑같은 일을 하는지, '장바구니 계산' 비유로 분해해 보겠습니다.

  1. items.fold( 0, ... )
    • fold의 첫 번째 인자 0은 '초기값'입니다.
    • "계산을 0원에서부터 시작하겠다!" 라는 의미입니다.
  2. (currentTotal, item) => ...
    • fold의 두 번째 인자는 '계산 규칙'입니다.
    • currentTotal: 현재까지 계산된 중간 합계 금액
    • item: 이번에 새로 계산할 장바구니 상품
  3. currentTotal + item.price
    • 가장 중요한 '계산' 부분입니다.
    • "현재까지의 합계(currentTotal)에, 이번 상품(item)의 가격(price)을 더해서 새로운 합계를 만든다."

이 과정이 장바구니의 마지막 상품까지 반복되면, fold는 최종적으로 계산된 총 금액을 결과로 반환합니다.

fold를 쓸까요?

  • 간결함: 여러 줄의 코드가 단 한 줄로 줄어들어 코드가 깔끔해집니다.
  • 불변성(Immutability): for문처럼 외부의 변수를 직접 변경하는 대신, 항상 새로운 계산 결과를 만들어 전달합니다. 이는 의도치 않은 버그를 줄이는 데 큰 도움이 됩니다.
  • 표현력: 코드를 읽을 때 "아, items 리스트를 하나의 값(총액)으로 합치려는 거구나" 라는 의도가 명확하게 드러납니다.

마치며~

fold는 처음에는 낯설 수 있지만, 그 원리를 한 번만 이해하면 for 반복문이 필요한 많은 상황에서 더 우아하고 안정적인 코드를 작성할 수 있게 해주는 강력한 도구랍니다! 😋

숫자를 더하거나, 최대/최소값을 찾거나, 문자열을 합치는 for 반복문을 fold로 바꿔보는 것이 가능하지요.

이전최근
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗