본문 바로가기
Language/Kotlin

코틀린에서의 `reduce`

by 시니성 2023. 10. 13.

Kotlin은 여러가지 내장 함수를 제공하며, 이를 통해 개발자는 간결하고 효과적인 코드를 작성할 수 있습니다. 여기서 reduce 함수는 특히 시퀀스나 컬렉션을 활용한 연산에서 강력한 유용성을 발휘합니다.

reduce의 기본 구조

reduce 함수는 컬렉션의 원소들을 하나씩 순회하면서 주어진 연산을 누적적으로 적용하고, 그 결과를 반환합니다. 그 기본적인 형태는 다음과 같습니다.

fun <T> Iterable<T>.reduce(
    operation: (acc: T, T) -> T
): T

이 함수는 두 개의 파라미터를 받는 operation 람다를 인자로 받습니다.

  • acc: 누적값으로써, 연산의 중간 결과를 저장합니다.
  • T: 현재 순회중인 컬렉션의 원소입니다.

기본 사용 예시

먼저 간단한 예를 들어 reduce의 사용법을 확인해봅시다.

val numbers = listOf(1, 2, 3, 4, 5)
val sum = numbers.reduce { acc, i -> acc + i }
println(sum)  // 출력: 15

이 코드는 1부터 5까지의 숫자를 더하는 연산을 합니다.

  • 먼저, 1 (초기 acc)와 2 (첫 번째 i)가 더해져 3이 됩니다.
  • 다음으로, 3 (새로운 acc)와 3 (다음 i)이 더해져 6이 됩니다.
  • 이런 식으로 마지막 원소까지 연산이 진행됩니다.

시나리오: 주문 목록에서 총 가격 계산하기

상점에서 관리해야 하는 주문 목록이 있다고 가정합시다. 각 주문은 상품과 그 상품의 가격으로 이루어져 있습니다. 이제 reduce를 사용해 모든 주문의 총 가격을 계산해볼까요?

data class Order(val item: String, val price: Double)

fun calculateTotal(orders: List<Order>): Double {
    // Order를 price만으로 변환하고, 가격들을 더함
    return orders.map { it.price }.reduce { acc, price -> acc + price }
}

여기서:

  • map { it.price }: 주문 목록을 가격 목록으로 변환합니다.
  • reduce { acc, price -> acc + price }: 가격들을 순회하며, 총 합을 계산합니다.

시나리오: 재고 관리

다음으로, 상점에서 각각의 상품에 대한 재고를 관리한다고 가정해봅시다. reduce를 사용하여 전체 상품의 총 재고량을 어떻게 계산할 수 있을까요?

data class Stock(val item: String, val quantity: Int)

fun calculateTotalStock(stocks: List<Stock>): Int {
    // 각 상품의 재고량을 모두 더함
    return stocks.map { it.quantity }.reduce { acc, quantity -> acc + quantity }
}

결론

reduce는 컬렉션의 여러 원소들을 단일 값으로 줄이는데 아주 유용하게 사용될 수 있습니다. 그런데 주의할 점은 reduce는 빈 컬렉션에서는 사용할 수 없다는 것입니다. 빈 컬렉션에 reduce를 사용하면 UnsupportedOperationException이 발생합니다. 이 경우 reduceOrNull을 사용하여 안전하게 null을 반환받을 수 있습니다.

val emptyList = emptyList<Int>()
val sum = emptyList.reduceOrNull { acc, i -> acc + i } ?: 0
println(sum)  // 출력: 0

코틀린의 reduce를 이용하여 여러분의 코드를 더 간결하고 읽기 쉽게 만들어보세요. 더 다양한 연산과 복잡한 로직에서도 reduce를 활용하면 기적과 같은 결과를 얻을 수 있습니다!