fold()
와 foldRight()
는 Kotlin의 표준 라이브러리에 있는 강력한 함수로, 리스트나 다른 컬렉션의 요소를 누적하는 데 사용됩니다. 이 글에서는 두 함수의 기능과 차이점을 탐색하겠습니다.
fold():
fold()
함수는 주어진 초기값부터 시작하여 컬렉션의 각 요소를 순차적으로 처리합니다.
구조:
fold(initialValue: R, operation: (acc: R, T) -> R): R
파라미터:
initialValue
: 누적 작업을 시작하는데 사용되는 초기 값입니다.operation
: 각 요소에 적용되는 연산. 여기서:acc
: 누적값 (accumulator)T
: 현재 리스트의 요소 (current element)
foldRight():
foldRight()
는 fold()
와 동작은 유사하지만, 리스트의 끝에서 시작하여 처음으로 거꾸로 처리합니다.
구조:
foldRight(initialValue: R, operation: (T, acc: R) -> R): R
파라미터:
initialValue
: 동일하게 누적 작업을 시작하는데 사용되는 초기 값.operation
: 각 요소에 적용되는 연산. 여기서:T
: 현재 리스트의 요소 (current element)acc
: 누적값 (accumulator)
코틀린의 fold()와 foldRight(): 처리 방향에 따른 차이점
fold()
와 foldRight()
의 주요 차이점은 처리 방향입니다. fold()
는 리스트의 시작부터 마지막까지 순차적으로 진행되며, foldRight()
는 리스트의 마지막에서 시작하여 처음까지 거꾸로 진행됩니다.
이 차이점을 확실하게 이해하기 위해, 문자열 연결 시나리오를 살펴보겠습니다.
시나리오:
문자열 리스트가 있습니다. 이 리스트에 fold()
와 foldRight()
를 사용하여 문자열을 연결하려고 합니다. 그런데 연결 과정에서 각 문자열 사이에 해당 문자열의 위치(인덱스)를 추가하려고 합니다.
val words = listOf("apple", "banana", "cherry")
// fold()를 사용하여 문자열 연결
val foldedResult = words.foldIndexed("") { index, acc, word ->
"$acc$word$index" // 단어와 그 다음의 위치를 누적 문자열에 추가
}
// foldRight()를 사용하여 문자열 연결
val foldedRightResult = words.foldRightIndexed("") { index, word, acc ->
"$word$index$acc" // 단어와 그 전의 위치를 누적 문자열의 앞에 추가
}
println(foldedResult) // 출력: apple0banana1cherry2
println(foldedRightResult) // 출력: cherry2banana1apple0
위의 예에서 fold()
는 문자열을 순차적으로 연결하면서 위치(인덱스)를 해당 문자열 뒤에 추가하였습니다. 반면에 foldRight()
는 문자열을 거꾸로 연결하면서 위치를 문자열 앞에 추가하였습니다.
이 시나리오는 fold()
와 foldRight()
가 어떻게 다르게 동작하는지를 잘 보여주는 예입니다. 처리 방향에 따라 얻게 되는 결과가 다르기 때문에, 사용 상황에 따라 적절한 함수를 선택해야 합니다.
결론적으로, fold()
와 foldRight()
는 리스트나 다른 컬렉션의 요소를 누적하여 처리하는 데 매우 유용합니다. 두 함수의 주요 차이점은 처리 방향입니다: fold()
는 처음에서 시작하여 마지막으로 진행되며, foldRight()
는 그 반대입니다.
'Language > Kotlin' 카테고리의 다른 글
Kotlin에서의 꼬리 재귀와 피보나치 수열 (0) | 2023.08.29 |
---|---|
Kotlin에서의 tailrec 이해하기 (0) | 2023.08.29 |
Kotlin의 `it` 키워드 (0) | 2023.08.29 |
Predicate란? (0) | 2023.08.29 |
코틀린의 `asSequence()` (0) | 2023.08.29 |