자바스크립트를 허용해주세요.
[ 자바스크립트 활성화 방법 ]
from Mohon Aktifkan Javascript!
 

[Scala] 7장 컬렉션과 데이터 처리

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