본문 바로가기

Mobile/Kotlin

[Kotlin-문법] fold 와 foldIndexed

반응형

1) fold 함수

fold 함수는 주어진 Int로만 구성된 Array 혹은 Collection 의 모든 element들을 연속적으로 불러와 계산할 수 있습니다. fold 함수는 파라미터로 initial값(초기값)을 받습니다. 예를 들어보겠습니다.

val absolutes = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

위 배열값들의 합을 얻는데, 초기값을 100으로 해보도록 하겠습니다.

val sumNumber = absolutes.fold(100) { sum, element ->
    sum + element
}

println(sumNumber) // 출력값: 155

출력값으로는 초기값 100에 absolutes 배열의 element 들의 합 55가 더해진 값 155가 출력됩니다. 어떻게 이렇게 될까요? 아래와 같이 fold 함수 내부에서 print 해보도록 하겠습니다.

val sumNumber = absolutes.fold(100) {
        sum, element ->
        println("sum::: $sum \nelement::: $element \nsum + element::: ${sum+element} \n")
        sum + element
}

처음 sum 의 값은 초기값으로 들어갔던 100을 갖고, element 값은 배열 absolutes의 첫 번째 값을 갖습니다. 여기서 우리는 "sum + element" 를 했습니다. 그 결과 두 번째 계산 때 sum은 초기값과 absoultes의 첫 번째 값을 합친 101을 갖고 있습니다. 다시 그 sum에 absolutes 두 번째 값을 더해 103 결과를 내고 10번째까지 이어져 결과적으로 155라는 값을 반환하게 됩니다.

2) foldIndexed 함수

foldIndexed 함수도 fold 함수와 마찬가지입니다. 다만 index를 같이 가져온다는 것이 fold 함수와 다른 점입니다.

기본적인 원리는 같기 때문에 아래 코드로 설명을 대신하도록 하겠습니다.

val absolutes = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val signs = booleanArrayOf(false, false, true, true, false, false, true, true, true, true)

val sumWithIndex = absolutes.foldIndexed(0) {
    idx, sum, element ->
    println("index::: $idx \nsum::: $sum \nelement::: $element")
    sum + if (signs[idx]) element else -element
}
반응형