728x90

📚 1. Scala 컬렉션
Scala는 함수형 프로그래밍(FP)와 객체지향(OOP)을 결합한 언어이며, 컬렉션 라이브러리가 풍푸하고 불변(immutable)과 가변(mutable) 컬렉션을 모두 제공하는 언어입니다. 데이터 처리 시 불변 컬렉션을 기본으로 사용하고, 필요시 가변컬렉션을 사용합니다.
| 컬렉션 | 특징 | 예시 |
|---|---|---|
| List | 순서가 있는 불변/가변 컬렉션, 중복 허용 | List(1,2,3) |
| Set | 순서 무관, 중복 ❌ | Set(1,2,3) |
| Map | 키-값 쌍, 키 중복 ❌ | Map("a" -> 1, "b" -> 2) |
| Vector | List 보다 빠른 임의 접근, 불변 컬렉션 |
Vector(1,2,3) |
| Seq | 순서 있는 컬렉션의 상위 타입 | Seq(1,2,3) |
👉 1-1. Immutable vs Mutable
🦖 Immutable 컬렉션
- 값이 한 번 생성되면 변경 불가
- 안전한 병렬 처리가 가능함
- 예시:
object Immutable{
def main(args: Array[String]): Unit = {
// Immutable
val list = List(1,2,3);
// list = list :+4 // 오류 , val 은 재할당 X
val newList = list :+4; // 새로운 리스트 생성
println(newList);
}
}
🦖 Mutable 컬렉션
- 값 변경 가능
- 성능은 좋으나, 부작용 발생 가능성 있음
import scala.collection.mutable.ListBuffer
object Mutable {
def main(args: Array[String]) : Unit = {
val mlist = ListBuffer(1,2,3);
mlist += 4 // 직접 변경 가능
println(mlist); // ListBuffer(1,2,3,4,5)
}
}
👉 Tip: 가능하면 Immutable 방식이 안전하며, 함수형 스타일에 적합
📚 2. 반복자와 데이터 처리
Scala에는 foreach, for, yield를 직접 사용하여 반복적으로 처리가 가능합니다.
🦖 foreach
- 컬렉셕의 각 요소에 대해 side-effect(사이드-이펙트) 함수 실행
object ForEach {
def main(args: Array[String]) : Unit = {
val nums = List(1,2,3)
nums.foreach(n => println(n * 2)) // result: 2, 4, 6
}
}
🦖 for
- 범위 기반 반복과 조건 처리 가능
object For {
def main(args: Array[String]) : Unit = {
for (n <- 1 to 5 if n % 2 == 0) {
println(n) // 2, 4
}
}
}
- 컬렉션 기반
object Collection {
def main(args: Array[String]) : Unit = {
val nums = List(1,2,3,4)
for(n <- nums) println(n)
}
}
🦖 for-yeild(컬렉션 변환)
- 컬렉션을 변환해 새 컬렉션을 생성함, map과 유사한 역할을 수행
object Yield {
def main(args: Array[String]): Unit = {
val nums = List(1,2,3,4)
val doubled = for(n <- nums) yield n * 2
println(doubled) // List(2,4,6,8)
val triple = for(n <- nums) yield n * 3
println(triple) // List(3,6,9,12)
}
}
📚 3. 컬렉션 조합 및 변환
🦖 map
- 각 요소를 반환
object Map {
def main(args: Array[String]) : Unit = {
val nums = List(1,2,3)
val squares = nums.map(n => n * n)
println(squares); // List(1,4,9)
}
}
🦖 filter
- 조건에 맞는 요소만 추출
object Filter {
def main(args: Array[String]) : Unit = {
val nums = List(1,2,3,4)
val evens = nums.filter(_ % 2 == 0)
println(evens); // List(2,4)
}
}
🦖 flatMap
- map + flatten이 합쳐진 것
object FlatMap {
def main(args: Array[String]) : Unit = {
val words = List("Hello", "World")
val letters = words.flatMap(_.toList)
println(letters) // List(H, e, l, l, o, W, o, r, l, d)
}
}
🦖 reduce / fold
- 컬렉션 집계
object ReduceFold {
def main(args: Array[String]) : Unit = {
val nums = List(1,2,3,4) // 1 + 2 + 3 + 4
val sum = nums.reduce(_ + _)
println(sum) // 10
val product = nums.fold(1)(_ * _) // 1 * 2 * 3 * 4
println(product) // 24
}
}
🦖 zip
- 두 컬렉션의 집합
object Zip {
def main(args: Array[String]): Unit = {
val a = List(1,2,3)
val b = List("a", "b", "c")
val zipped = a.zip(b)
println(zipped) // List((1,a), (2,b), (3,c))
}
}
📚 4. Set과 Map 활용 예시
🦖 Set(중복 제거)
object Set {
def main(args: Array[String]) : Unit = {
val nums = List(1,2,2,3)
val unique = nums.toSet
val str = List(
"Mason", "Kelly", "Gold", "Pictures",
"Gold", "King", "Take", "Kelly"
);
val uniques = str.toSet
println(uniques) // HashSet(Take, King, Pictures, Gold, Mason, Kelly)
println(unique) // Set(1,2,3)
}
}
🦖 Map(키-값 데이터)
object Maps {
def main(args: Array[String]) : Unit = {
val map = Map("Dragon" -> 1, "Player" -> 2)
// New
val newMap = map + ("Hp Default" -> 100)
println(newMap) // Map(Dragon -> 1, Player -> 2, Hp Default -> 100)
val Menu = Map("Game Start" -> 1, "Options" -> 2, "Exit" -> 3)
}
}
📚 5. Vector와 성능
- List는 앞쪽 샆입이 빠르나 임의 접근은 느림, Vector는 임의 접근이 빠름(O(logn))
object Vectors {
def main(args: Array[String]): Unit = {
val vec = Vector(1,2,3,4,5)
println(vec(3)) // 4
}
}
📚 요약
- Immutable 컬렉션은 기본적으로 사용하고, 필요시 mutable을 사용
- 반복문은 for, foreach, yield를 사용
- 데이터 변환: map,filter, flatMap, reduce, fold
- Set/Map으로 중복 제거와 키-값 처리
- 성능 필요 시 Vector 사용
GitHub - Koras02/scala-bloging: https://thinky.tistory.com/category/Back-End/Scala
https://thinky.tistory.com/category/Back-End/Scala - Koras02/scala-bloging
github.com
728x90
LIST
'Back-End > Scala' 카테고리의 다른 글
| [Scala] 8장 비동기 프로그래밍과 동시성 (0) | 2025.09.06 |
|---|---|
| [Scala] 6장 - 에러 처리 (1) | 2025.08.18 |
| [Scala] 5장 - 패턴 매칭 & Case 클래스 (4) | 2025.08.14 |
| [Scala] 4장 - 함수형 프로그램 (FP) 패러다임 (0) | 2025.08.12 |
| [Scala] 3장 - 객체지향 프로그래밍(OOP) (1) | 2025.08.09 |