용법

Scala에서 for-comprehension은 반복, 필터링, 값을 추출하고 조합하는 데 사용되는 강력한 구문입니다. 이는 주로 여러 컬렉션에서 값을 추출하거나, 변환을 할 때 사용되며, 내부적으로는 map, flatMap, filter 등과 같은 함수의 축약 표현입니다.

기본 구조

for (x <- collection) yield expression

예제

val numbers = List(1, 2, 3)
val result = for (n <- numbers) yield n * 2
println(result) // List(2, 4, 6)

이 예제에서 for-comprehension은 리스트의 각 요소를 두 배로 곱한 새로운 리스트를 반환합니다.

중첩 for-comprehension

여러 컬렉션을 동시에 순회하면서 값을 조합할 수 있습니다. 나중에 등장하는 컬렉션부터 순회합니다. 즉, 먼저 등장하는 컬렉션이 outer입니다.

val list1 = List(1, 2, 3)
val list2 = List("a", "b", "c")
val result = for {
  x <- list1
  y <- list2
} yield (x, y)
println(result)
// 출력: List((1,a), (1,b), (1,c), (2,a), (2,b), (2,c), (3,a), (3,b), (3,c))

위 코드에서 두 리스트의 모든 조합(Cartesian product)을 생성합니다. 중괄호 {}를 사용하면 여러 줄을 깔끔하게 표현할 수 있습니다.

조건을 추가한 필터링

for-comprehension에서 조건을 추가해 특정 조건을 만족하는 값만 추출할 수 있습니다.

val numbers = List(1, 2, 3, 4, 5, 6)
val evenNumbers = for {
  n <- numbers
  if n % 2 == 0 // 짝수만 필터링
} yield n
println(evenNumbers) // List(2, 4, 6)

위 예제에서는 리스트에서 짝수만 필터링해서 새로운 리스트를 만듭니다. if 구문을 이용해 조건을 추가할 수 있습니다.

yield 없이 사용하기

yield를 사용하지 않으면 단순히 반복 작업만 수행할 수 있습니다.