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
를 차례로 가져와 둘을 곱한 값을 담아냈습니다.