✅ Kotlin에서는 reduce, fold, scan 등 누적 함수(Accumulation Functions)를 이용해 리스트 내의 값을 누적하거나 계산할 수 있습니다.
🔹 reduce — 왼쪽부터 누적
val list = listOf(1, 2, 3, 4)
val sum = list.reduce { acc, value -> acc + value } // 10
- 초기값 없이 첫 번째 요소를 초기값으로 사용
- 두 번째 요소부터 누적
// 연산 순서: (((1 + 2) + 3) + 4)
⚠️ 주의
- 빈 리스트에
reduce() 사용 시 예외 발생 → fold() 권장
🔹 fold — 초기값부터 누적
val list = listOf(1, 2, 3, 4)
val sum = list.fold(10) { acc, value -> acc + value } // 20
- 초기값을 지정하여 누적 시작
- 연산 순서: (((10 + 1) + 2) + 3 + 4)
🔹 reduceRight / foldRight — 오른쪽부터 누적
val result = listOf("a", "b", "c").reduceRight { value, acc -> "$value-$acc" }
// 결과: "a-b-c"
- 오른쪽에서 왼쪽으로 순서대로 누적
- foldRight은 초기값 지정 가능
🔹 scan / scanRight — 중간 결과 포함 누적
val result = listOf(1, 2, 3).scan(0) { acc, value -> acc + value }
// 결과: [0, 1, 3, 6] ← 중간 누적값 포함
- fold와 거의 동일하되, 중간 단계 결과까지 리스트로 반환
val result = listOf("a", "b", "c").scanRight("z") { value, acc -> "$value$acc" }
// 결과: ["abcz", "bcz", "cz", "z"]
✅ 요약 정리
| 함수 |
초기값 |
방향 |
반환 타입 |
중간 결과 포함 |
비고 |
| reduce |
❌ |
왼→오 |
T |
❌ |
빈 리스트 시 예외 발생 |
| fold |
✅ |
왼→오 |
R |
❌ |
안전함 (초기값 필수) |
| reduceRight |
❌ |
오→왼 |
T |
❌ |
순서 주의 |
| foldRight |
✅ |
오→왼 |
R |
❌ |
〃 |
| scan |
✅ |
왼→오 |
List |
✅ |
중간 결과 반환 |
| scanRight |
✅ |
오→왼 |
List |
✅ |
〃 |
✅ 고차 함수 vs 유틸 함수 vs 누적 함수 — 비교 요약
| 구분 |
고차 함수 |
유틸 함수 |
누적 함수 |
| 작동 대상 |
각 요소에 대해 독립적으로 작동 |
컬렉션 전체 구조 또는 다중 컬렉션 대상 |
컬렉션 전체에 대해 누적 계산 수행 |
| 주요 역할 |
필터링, 변환, 조건 검사 |
병합, 슬라이딩, 구간 분할, 평탄화 |
합산, 누적값 계산, 접기 등 |
| 대표 함수 |
map, filter, any, groupBy |
zip, chunked, windowed, flatMap |
reduce, fold, scan |
| 리턴 값 |
(보통) 변형된 컬렉션 |
(보통) 변형된 컬렉션 |
단일 값 또는 누적 리스트 (scan) |
| 예외 주의 |
거의 없음 |
거의 없음 |
reduce()는 빈 리스트 시 예외 발생
fold()는 초기값이 있어 안전 |
다음은 시리즈 ⑬: 기타 유용한 스코프 확장 함수 정리 (takeIf, also, apply, let 등) 으로 이어집니다.