스칼라 for문

Volc·2023년 4월 13일
0

Scala

목록 보기
9/9

for 루프

  • for 내장(comprehension) 또는 for 식(expression)이라고 부른다.
    val dogBreeds = List("Doberman", "Yorkshire Terrier", "Dachshund",
                        "Scottish Terrier", "Great Dane", "Portuguese Water Dog")
    for (breed <- dogBreeds)
        println(breed)
  • dobBreeds 리스트의 모든 원소에 대해 값을 저장할 breed라는 임시 변수를 만들고 출력한다는 코드이다.

제너레이터 식

  • 컬렉션에서 개별 값을 생성해내므로 붙은 이름이다.
  • '<-'는 List와 같은 컬렉션을 순회하기 위해 사용한다.
    for (i <- 1 to 10) println(i)

가드: 값 걸러내기

  • if 식을 추가해서 원소를 걸러내고 원소만 남길 수 있다.
  • 이런식을 가드라고 한다.
    val dogBreeds = List("Doberman", "YorkShire Terrier", "dachshund",
                        "Scottish Terrier", "Great Dane", "Portugese Water Dog")

    for (breed <- dogBreeds
        if breed.contains("Terrier")
    ) 	println(breed)
  • 가드를 둘 이상도 추가 할 수 있다.
    val dogBreeds = List("Doberman", "YorkShire Terrier", "dachshund",
                        "Scottish Terrier", "Great Dane", "Portugese Water Dog")

    for (breed <- dogBreeds
        if breed.contains("Terrier")
        if !breed.startsWith("Yorkshire")
    )	println(breed)

    for (breed <- dogBreeds
        if breed.contains("Terrier") && !breed.startsWith("Yorkshire")
    )	println(breed)
    // if 두개 하나로 합치기

yield로 값 만들어내기

  • 걸러낸 컬렉션의 결과를 모아서 넘길 때는 yield 키워들르 이용해서 for 식으로 새로운 컬렉션을 만든다.
    val dogBreeds = List("Doberman", "YorkShire Terrier", "dachshund",
                        "Scottish Terrier", "Great Dane", "Portugese Water Dog")

    val filteredBreeds = for {
        breed <- dogBreeds
        if breed.contains("Terrier") && !breed.startsWith("Yorkshire")
    } 	yield breed
  • for 식을 매번 반복하면서 걸러낸 결과를 breed라는 이름의 값으로 만들어낸다.
  • 이 결과는 매 루프마다 누적되며, 결과 컬렉션은 filteredBreeds라는 값에 저장된다.

확장 영역과 값 정의

val dogBreeds = List(Some("Doberman"), None, Some("Yorkshire Terrier"),
					Some("Dachshund"), None, Some("Scottish Terrier"),
                   	None, Some("Great Dane"), Some("Portuguese Water Dog"))
                    
println("first pass:")
for {
	breedOption <- dogBreeds
    breed <- breedOption
    upcasedBreed = breed.toUpperCase()
}	println(upcasedBreed)

println("second pass:")
for {
	Some(breed) <- dogBreeds
    upcasedBreed = breed.toUpperCase()
}	println(upcasedBreed)
  • 첫 for 내장의 첫번째 식에서 뽑아낸 원소는 Option이다.
  • 그다음 줄에서는 화살표를 사용해서 Option에 들어 있는 값을 빼낸다.
  • for 내장에서는 None 처리를 건너뛰기 때문에 None에서 값을 빼내는 일은 생각하지 않아도 된다.
  • 두번째 for문에서 'Some(breed) <- dogBreeds' Some인 경우에만 성곡해서 뽑아낸다.

<- 와 = 은 언제 사용할까?

  • 컬렉션이나 Option과 같은 다른 '컨테이너'를 대상으로 반복하면서 값을 가져와야 하는 경우 화살표를 사용한다.
  • for 내장에 첫번째 식은 반드시 화살표를 사용한 추출 반복이어야 한다.
  • 반복과 관계없이 값을 대입해야 하는 경우에는 등호를 사용한다.
profile
미래를 생각하는 개발자

0개의 댓글