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
를 활용하면 기적과 같은 결과를 얻을 수 있습니다!
'Language > Kotlin' 카테고리의 다른 글
Sealed Class란 무엇인가? (0) | 2023.10.13 |
---|---|
Event Sourcing을 통한 함수형 프로그래밍의 적용 (0) | 2023.10.13 |
Kotlin에서의 기본 인자 값과 널 허용성 (0) | 2023.10.12 |
Kotlin Companion Object에 대해 (0) | 2023.09.20 |
Kotlin의 'All' 함수에 대해 (0) | 2023.09.15 |