학습
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)
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)
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")
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. 정리
다음에 학습하면 좋은 주제: