IMCAT.DEV
로그인 가입
Kotlin 입문 함수형

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]

코드 한 줄씩 동작 설명

  1. val numbers = listOf(1, 2, 3, 4, 5): 숫자 1부터 5까지의 리스트를 생성합니다.
  2. val squaredNumbers = numbers.map { it * it }: map을 사용하여 각 숫자를 제곱합니다. it는 리스트의 각 요소를 나타냅니다.
  3. println(squaredNumbers): 제곱된 숫자 리스트를 출력합니다.
  4. val evenNumbers = numbers.filter { it % 2 == 0 }: filter를 사용하여 짝수만 걸러냅니다.
  5. println(evenNumbers): 짝수 리스트를 출력합니다.
  6. 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() }
      변환 후 결과 타입을 확인해야 합니다.

      6. 정리

    • map은 컬렉션의 각 요소를 변환하는 데 사용됩니다.
    • filter는 조건에 맞는 요소만 걸러내는 데 유용합니다.
    • 실무에서 자주 사용되는 패턴으로 데이터를 처리할 수 있습니다.
    • map과 filter를 적절히 사용하여 코드의 가독성을 높일 수 있습니다.
    • 다음에 학습하면 좋은 주제는 flatMap과 reduce입니다.