본문 바로가기
Language/Kotlin

코틀린의 fold()와 foldRight()

by 시니성 2023. 8. 29.

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