for-함축

스칼라에서 for 구문은, 단순 반복문보다 특별한 기능이 있습니다. 우선 단순 반복문으로 쓰는 예제부터 보겠습니다.

for 이터레이션

스칼라의 for 구문도, 자바에서 쓰는 for 이터레이션과 비슷하게, 컬렉션의 모든 요소를 차례로 다루는 용도로 쓰는 것이 기본입니다.

val xs = List(1, 2, 3)
for (x <- xs) println(x)

만약, 꼭 인덱스가 필요하다면, 0 to 9처럼 Range를 이용합니다.

for (n <- 0 to 9) println(n)

for 구문의 앞부분에 있는 <- 기호로 이은 부분을 제너레이터(generator)라고 부릅니다. 제너레이터에 있는 값들을 차례로 접근해 반복합니다.

중첩 for 루프

중첩한 for 반복문을 써서 구구단 표를 보이겠습니다.

for {
  i <- 2 to 9
  j <- 1 to 9
} println(s"$i x $j = ${i * j}")

for 구문을 두 번 중첩해 쓰는 게 아니라, 제너레이터를 두 번 이어서 쓴 점을 자세히 봐주세요.

for-yield로 컬렉션 만들기

val xs = List(1, 2, 3)

val ys = for (x <- xs) yield x * 2 // => List(2, 4, 6)

for 구문의 제너레이터에 컬렉션을 주었고, 마지막 표현식 직전에 yield라는 키워드를 붙였습니다. 이 경우, yield 이후에 나오는 식을 평가한 값을 차례로 담고 있는 컬렉션을 반환합니다.

즉, 위 예제의 마지막 줄에서는, xs에서 값을 차례로 가져와 x라고 한 뒤, 여기에 x * 2를 해서 차례로 ys에 담은 셈입니다.

제너레이터 여러 개로 컬렉션 다루기

val xs = List(3, 4, 5)
val ys = List(1, 2)

for {
  x <- xs
  y <- ys
} yield x * y
// => List(3, 6, 4, 8, 5, 10)

중첩 for 루프에서 설명드린 것처럼, 두 제네레이터를 차례로 썼습니다. xs에서 x를 하나씩 가져온 다음, ys에서 y를 차례로 가져와 둘을 곱한 값을 담아냈습니다.