순차적인 자료들을 다루기 위한 for문 사용을 제공

case class User(name: String, age: Int)

val userBase = List(
  User("Travis", 28),
  User("Kelly", 33),
  User("Jennifer", 44),
  User("Dennis", 23))

val twentySomethings =
  for (user <- userBase if user.age >=20 && user.age < 30)
  yield user.name  // i.e. add this to a list

twentySomethings.foreach(println)  // prints Travis Dennis

case class User(name: String, age: Int)

val userBase = List(
  User("Travis", 28),
  User("Kelly", 33),
  User("Jennifer", 44),
  User("Dennis", 23))

val twentySomethings =
  for user <- userBase if user.age >=20 && user.age < 30
  yield user.name  // i.e. add this to a list

twentySomethings.foreach(println)  // prints Travis Dennis

for문에서 yield e를 반환하게된다.

user <- userBase : enumerate ⇒ userbase에서 user를 하나씩 뽑아내서 쓰는 generator

yield 문과 함께 list로 반환한다. / 최종 결과는 List[String]이다.

if user.age >=20 && user.age < 30 : filter 조건문

제너레이터를 두개를 써서 좀 더 복잡한 예시가 있다.

def foo(n: Int, v: Int) =
   for i <- 0 until n
       j <- 0 until n if i + j == v
   yield (i, j)

foo(10, 10).foreach {
  (i, j) => println(s"($i, $j) ")  // prints (1, 9) (2, 8) (3, 7) (4, 6) (5, 5) (6, 4) (7, 3) (8, 2) (9, 1)
}

→ 보통 일반적으로 for문을 중첩으로 돌려야 하는데 스칼라에서는 위같이 표현 가능하다.

scala2에서는 세미콜론으로 복수의 제너레이터를 구분한다.

for 문은 리스트에서만 쓸 수 있는 것은 아니다.

yield문을 생략할 수 있는데 이때는 unit을 반환한다. → 이는 사이드 이펙트 처리로 화면에 단순히 출력하고자할때 유용하다.