IMCAT.DEV
로그인 가입
Scala 중급 자료구조

Scala 컬렉션의 고급 사용법

Scala 컬렉션의 고급 사용법 — 중급

컬렉션의 고급 사용법

1. 도입 (왜 배워야 하는가)

Scala에서 컬렉션은 데이터 구조를 관리하고 조작하는 데 필수적인 도구입니다. 실무에서는 대량의 데이터를 효율적으로 처리해야 하며, 컬렉션을 효과적으로 활용하지 않으면 코드가 복잡해지고 유지보수가 어려워질 수 있습니다. 예를 들어, 데이터베이스에서 여러 레코드를 가져와 필터링하고, 정렬하고, 그룹화해야 하는 경우가 많습니다. 이러한 작업을 쉽게 수행하기 위해서는 컬렉션의 고급 기능들을 잘 이해하고 활용할 수 있어야 합니다.

컬렉션의 고급 사용법을 모른다면, 데이터 처리에 필요한 복잡한 로직을 수동으로 구현해야 하며, 이는 시간과 비용이 많이 드는 비효율적인 방법입니다.

2. 핵심 개념 설명

2.1. 고차 함수 (Higher-Order Functions)

고차 함수는 다른 함수를 인자로 받거나 함수를 반환하는 함수를 의미합니다. 이는 함수형 프로그래밍의 중요한 개념으로, 코드의 재사용성을 높이고 가독성을 향상시킵니다.

비유: 고차 함수는 요리사에게 특정 요리를 만드는 방법을 알려주는 레시피와 같으며, 요리사는 이 레시피를 바탕으로 다양한 요리를 만들어낼 수 있습니다.

2.2. 맵 (Map)과 필터 (Filter)

  • 맵: 주어진 컬렉션의 각 요소에 대해 주어진 함수를 적용하여 새로운 컬렉션을 생성합니다.
  • 필터: 주어진 조건을 만족하는 요소만을 포함하는 새로운 컬렉션을 생성합니다.
  • 연산자설명
    map모든 요소에 함수를 적용하여 새 컬렉션 생성
    filter조건을 만족하는 요소만 포함하는 새 컬렉션 생성

    2.3. 그룹화 (Grouping)

    그룹화는 컬렉션의 요소들을 특정 기준에 따라 묶어주는 기능입니다. 예를 들어, 특정 속성에 따라 데이터를 그룹화할 수 있습니다.

    3. 기본 코드 예제

    // 기본 컬렉션 생성
    val numbers = List(1, 2, 3, 4, 5)
    
    // 각 요소에 2를 곱하는 맵
    val doubled = numbers.map(_ * 2)
    // 필터: 짝수만 추출
    val evens = numbers.filter(_ % 2 == 0)
    
    // 결과 출력
    println(s"Doubled: $doubled")  // Doubled: List(2, 4, 6, 8, 10)
    println(s"Evens: $evens")      // Evens: List(2, 4)
  • 1행: 1부터 5까지의 정수를 포함하는 리스트를 생성합니다.
  • 3행: 각 요소에 2를 곱하는 맵 함수를 적용해 새로운 리스트를 만듭니다.
  • 6행: 짝수만 필터링하여 새로운 리스트를 만듭니다.
  • 9-10행: 결과를 출력합니다.
  • 4. 실전 활용 예제

    4.1. 쇼핑몰에서 장바구니 구현

    장바구니에 담긴 아이템의 가격을 계산하고, 특정 조건에 따라 할인된 가격을 적용하는 예제입니다.

    case class Item(name: String, price: Double)
    
    val cart = List(
      Item("사과", 1000),
      Item("바나나", 800),
      Item("체리", 1500)
    )
    
    // 전체 가격 계산
    val totalPrice = cart.map(_.price).sum
    
    // 1000원 이상 아이템에 10% 할인
    val discountedPrices = cart.map(item => if (item.price >= 1000) item.price * 0.9 else item.price)
    
    println(s"Total Price: $totalPrice")  // Total Price: 3300.0
    println(s"Discounted Prices: $discountedPrices")  // Discounted Prices: List(900.0, 800.0, 1350.0)
  • 1-3행: 아이템 모델을 정의하고 장바구니를 생성합니다.
  • 6행: 모든 아이템의 가격을 더하여 전체 가격을 계산합니다.
  • 9행: 가격이 1000원 이상인 아이템에 대해 10% 할인을 적용합니다.
  • 4.2. 데이터 그룹화

    학생의 성적을 기준으로 그룹화하는 예제입니다.

    case class Student(name: String, score: Int)
    
    val students = List(
      Student("홍길동", 85),
      Student("김철수", 90),
      Student("이영희", 85),
      Student("박민수", 70)
    )
    
    // 성적 기준으로 그룹화
    val groupedByScore = students.groupBy(_.score)
    
    println(s"Grouped by score: $groupedByScore")
  • 1-3행: 학생 모델을 정의하고 리스트를 생성합니다.
  • 6행: 성적을 기준으로 학생들을 그룹화합니다.
  • 5. 흔한 실수와 주의사항

    5.1. 잘못된 컬렉션 사용

    val numbers = List(1, 2, 3, 4, 5)
    // 잘못된 필터 사용: 조건이 항상 false
    val evens = numbers.filter(_ > 6) // 항상 빈 리스트 반환
  • 올바른 코드: 짝수 조건으로 필터링
  • val evens = numbers.filter(_ % 2 == 0) // 올바른 필터 사용

    5.2. 불필요한 중첩

    val doubledEvens = numbers.map(n => if (n % 2 == 0) n * 2 else n)
    // 비효율적인 코드
  • 올바른 코드: 먼저 필터링 후 맵 적용
  • val doubledEvens = numbers.filter(_ % 2 == 0).map(_ * 2) // 효율적인 코드

    6. 정리

  • 고차 함수는 코드의 재사용성과 가독성을 높입니다.
  • 맵과 필터는 컬렉션 처리의 핵심 기능입니다.
  • 그룹화 기능을 활용하면 데이터를 보다 쉽게 관리할 수 있습니다.
  • 다음에 학습하면 좋은 주제:

  • Scala의 패턴 매칭
  • 액터 모델과 비동기 프로그래밍
  • 데이터 스트리밍과 실시간 데이터 처리