학습
Kotlin 스트림 처리 (map, filter)
Kotlin 스트림 처리 (map, filter) — 초급
스트림 처리 (map, filter)
1. 도입 (왜 배워야 하는가)
Kotlin에서 스트림 처리, 특히 map과 filter는 데이터를 효율적으로 변환하고 필터링하는 데 필수적인 도구입니다. 실무에서 대량의 데이터를 다루는 경우, 이러한 연산을 사용하여 데이터 흐름을 간결하고 가독성 높게 유지할 수 있습니다. 예를 들어, 쇼핑몰에서 사용자의 장바구니에서 특정 조건에 맞는 상품의 가격을 계산하거나, 사용자의 구매 기록에서 특정 카테고리의 상품만 추출하는 작업을 할 때 매우 유용합니다.
이러한 기능을 모르는 상태에서 데이터를 처리하게 되면, 복잡한 반복문을 사용해야 하며, 이로 인해 코드가 비효율적이고 가독성이 떨어지게 됩니다. 결과적으로 코드 유지 보수와 이해가 어려워질 수 있습니다.
2. 핵심 개념 설명
map
map은 컬렉션의 각 요소를 변환하는 기능입니다. 예를 들어, 숫자 리스트가 있을 때 각 숫자를 제곱하는 작업을 수행할 수 있습니다. 실생활 비유로는, 과일 가게에서 사과를 사면, 각각의 사과를 잘라서 사과 조각으로 만드는 것과 비슷합니다. 원래의 사과는 그대로지만, 형태가 변한 것을 얻는 것이죠.
filter
filter는 컬렉션의 요소 중 일부를 조건에 맞게 걸러내는 기능입니다. 예를 들어, 숫자 리스트에서 짝수만 추출하고 싶을 때 사용할 수 있습니다. 이는 마치 친구들과 함께 영화를 고를 때, 특정 장르(예: 액션 영화)만 선택하는 것과 같습니다.
| 용어 | 설명 |
|---|---|
| map | 각 요소를 변환하여 새로운 컬렉션 생성 |
| filter | 조건에 따라 요소를 걸러내어 새로운 컬렉션 생성 |
3. 기본 코드 예제
fun main() {
// 숫자 리스트를 정의합니다.
val numbers = listOf(1, 2, 3, 4, 5)
// map을 사용하여 각 숫자를 제곱합니다.
val squaredNumbers = numbers.map { it * it }
println(squaredNumbers) // [1, 4, 9, 16, 25]
// filter를 사용하여 짝수만 걸러냅니다.
val evenNumbers = numbers.filter { it % 2 == 0 }
println(evenNumbers) // [2, 4]
}
실행 결과
[1, 4, 9, 16, 25]
[2, 4]
코드 한 줄씩 동작 설명
val numbers = listOf(1, 2, 3, 4, 5): 숫자 1부터 5까지의 리스트를 생성합니다.val squaredNumbers = numbers.map { it * it }:map을 사용하여 각 숫자를 제곱합니다.it는 리스트의 각 요소를 나타냅니다.println(squaredNumbers): 제곱된 숫자 리스트를 출력합니다.val evenNumbers = numbers.filter { it % 2 == 0 }:filter를 사용하여 짝수만 걸러냅니다.println(evenNumbers): 짝수 리스트를 출력합니다.- 잘못된 코드:
- 올바른 코드:
- 잘못된 코드:
- 올바른 코드:
map은 컬렉션의 각 요소를 변환하는 데 사용됩니다.filter는 조건에 맞는 요소만 걸러내는 데 유용합니다.- 실무에서 자주 사용되는 패턴으로 데이터를 처리할 수 있습니다.
map과filter를 적절히 사용하여 코드의 가독성을 높일 수 있습니다.- 다음에 학습하면 좋은 주제는
flatMap과reduce입니다.
4. 실전 활용 예제
예제 1: 쇼핑몰 장바구니에서 할인 적용
data class Product(val name: String, val price: Double)
fun main() {
val cart = listOf(
Product("사과", 1000.0),
Product("바나나", 1500.0),
Product("체리", 2000.0)
)
// 모든 상품에 10% 할인 적용
val discountedCart = cart.map { Product(it.name, it.price * 0.9) }
println(discountedCart)
}
예제 2: 사용자 구매 기록에서 특정 카테고리 필터링
data class Purchase(val item: String, val category: String)
fun main() {
val purchases = listOf(
Purchase("사과", "과일"),
Purchase("면도기", "위생용품"),
Purchase("바나나", "과일")
)
// 과일 카테고리만 추출
val fruitPurchases = purchases.filter { it.category == "과일" }
println(fruitPurchases)
}
이와 같은 예제는 실무에서 자주 발생하는 패턴으로, 데이터를 처리하고 사용자에게 제공하는 데 매우 유용합니다.
5. 흔한 실수와 주의사항
실수 1: map과 filter의 혼동
val evenSquares = numbers.filter { it * it }
val evenSquares = numbers.filter { it % 2 == 0 }.map { it * it }
filter는 조건을 반환해야 하며,map은 변환을 수행합니다.
실수 2: 변환 후 타입을 의식하지 않음
val result = numbers.map { it * 2 }.filter { it > 5 }
val result = numbers.map { it * 2 }.filter { it > 5 }.map { it.toString() }
변환 후 결과 타입을 확인해야 합니다.