Scala for Backend Engineering & Functional Programming · 강의

Option과 Future 함께 사용

모나드형 연결을 알아봅니다

레슨 4/413개 단계

Option과 Future 함께 사용은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

컬렉션을 넘어서

for-comprehension은 목록에만 사용할 수 있는 것이 아닙니다. map과 flatMap을 제공하는 모든 형식을 사용할 수 있으며, 여기에는 Option, Either, Try, Future가 포함됩니다. 이를 모나드 체이닝이라고 합니다.

object Main {
  def main(args: Array[String]): Unit = {
    val sum = for {
      a <- Some(10)
      b <- Some(20)
    } yield a + b
    println(sum)
  }
}

Option은 None에서 일찍 중단됩니다

Option을 사용하면 모든 생성자가 Some일 때만 comprehension이 결과를 생성합니다. 하나라도 None이면 전체 결과가 None이 되고 이후 단계는 건너뜁니다.

object Main {
  def main(args: Array[String]): Unit = {
    val ok = for {
      a <- Some(2)
      b <- Some(3)
    } yield a * b

    val missing = for {
      a <- Some(2)
      b <- None: Option[Int]
    } yield a * b

    println(ok)
    println(missing)
  }
}

선택적 조회 연결하기

일반적인 패턴은 Map에서 키를 조회하는 것입니다. 각 조회는 Option을 반환합니다. for-comprehension은 모든 조회가 성공한 경우에만 값을 생성합니다.

object Main {
  def main(args: Array[String]): Unit = {
    val prices = Map("apple" -> 3, "bread" -> 5)
    val total = for {
      a <- prices.get("apple")
      b <- prices.get("bread")
    } yield a + b
    println(total)

    val missing = for {
      a <- prices.get("apple")
      c <- prices.get("milk")
    } yield a + c
    println(missing)
  }
}

중첩된 if-else보다 나은 이유

for-comprehension이 없다면 패턴 일치나 null 검사를 중첩해야 합니다. 모나드 형식은 이 피라미드 구조를 깔끔하고 선형적인 순서로 평탄화합니다.

object Main {
  def parse(s: String): Option[Int] = s.toIntOption
  def main(args: Array[String]): Unit = {
    val result = for {
      x <- parse("40")
      y <- parse("2")
    } yield x + y
    println(result)
  }
}

Option에서도 가드를 사용할 수 있습니다

Option comprehension 안의 가드는 조건이 실패할 때 값을 None으로 바꾸므로, 인라인 검증처럼 작동합니다.

object Main {
  def main(args: Array[String]): Unit = {
    def validate(age: Int): Option[Int] =
      for {
        a <- Some(age)
        if a >= 18
      } yield a
    println(validate(25))
    println(validate(15))
  }
}

Future 소개

Future는 나중에 사용할 수 있게 될 값을 나타냅니다. Option처럼 map과 flatMap을 제공하므로 for-comprehension으로 비동기 단계를 순서대로 실행할 수 있습니다.

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._

object Main {
  def main(args: Array[String]): Unit = {
    val f = for {
      a <- Future(10)
      b <- Future(20)
    } yield a + b
    println(Await.result(f, 2.seconds))
  }
}

여기서는 Future가 순차적으로 실행됩니다

for-comprehension에서 한 생성자가 다른 생성자에 의존하면, 각 flatMap이 이전 결과를 기다리므로 Future는 순차적으로 실행됩니다.

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._

object Main {
  def main(args: Array[String]): Unit = {
    val f = for {
      a <- Future(5)
      b <- Future(a * 2)
    } yield a + b
    println(Await.result(f, 2.seconds))
  }
}

Future를 병렬로 실행하기

Future를 병렬로 실행하려면 for-comprehension 전에 Future를 시작한 다음 결합하십시오. 서로 독립적인 작업이 기다리지 않고 겹쳐서 실행됩니다.

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._

object Main {
  def main(args: Array[String]): Unit = {
    val fa = Future(100)
    val fb = Future(200)
    val combined = for {
      a <- fa
      b <- fb
    } yield a + b
    println(Await.result(combined, 2.seconds))
  }
}

더 풍부한 오류 정보를 제공하는 Either

Either[E, A]는 실패할 때 오류 값을 전달합니다. for-comprehension에서는 첫 번째 Left에서 실행을 중단하고 해당 값을 반환합니다.

object Main {
  def parse(s: String): Either[String, Int] =
    s.toIntOption.toRight(s"not a number: $s")
  def main(args: Array[String]): Unit = {
    val good = for { a <- parse("3"); b <- parse("4") } yield a + b
    val bad  = for { a <- parse("3"); b <- parse("x") } yield a + b
    println(good)
    println(bad)
  }
}

같은 형태, 다양한 형식

Option, Either, Try, Future 중 무엇을 사용하든 comprehension의 형태가 동일해 보인다는 점에 주목하십시오. 달라지는 것은 실패의 의미뿐입니다. 이러한 일관성이 모나드 체이닝의 강점입니다.

import scala.util.Try

object Main {
  def main(args: Array[String]): Unit = {
    val result = for {
      a <- Try("21".toInt)
      b <- Try("2".toInt)
    } yield a * b
    println(result)
  }
}

형식을 섞어 사용할 수 없습니다

하나의 comprehension에 있는 모든 생성자는 같은 모나드여야 합니다. Option 생성자와 Future 생성자를 직접 섞을 수 없습니다. 먼저 한쪽을 변환해야 합니다(예: Future.fromTry를 사용하거나 Option을 감싸기).

object Main {
  def main(args: Array[String]): Unit = {
    // Convert the Option to keep types consistent
    val maybe: Option[Int] = Some(7)
    val result = for {
      a <- maybe
      b <- maybe.map(_ + 1)
    } yield a + b
    println(result)
  }
}

빠른 확인

Option for-comprehension에서 생성자 하나가 None을 생성하면 어떻게 됩니까?

복습

for-comprehension을 사용한 모나드 체이닝에 대해 다음을 배웠습니다.

  • map과 flatMap이 있는 모든 형식에서 사용할 수 있습니다
  • Option은 None에서 일찍 중단됩니다
  • Either와 Try는 실패할 때 오류 정보를 전달하며 실행을 중단합니다
  • Future는 비동기 단계를 순서대로 실행하며, 병렬 실행을 위해 일찍 시작해야 합니다
  • 모든 생성자는 같은 모나드 형식을 공유해야 합니다
무료로 시작

AI 튜터와 함께 Scala을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
39
레슨
143

자주 묻는 질문

“Option과 Future 함께 사용” 강의는 무료인가요?

네 — “Option과 Future 함께 사용” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

“Option과 Future 함께 사용”에서 뭘 배우나요?

모나드형 연결을 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“Option과 Future 함께 사용” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. for 구문 풀어쓰기
  2. if로 필터링
  3. 여러 생성기
  4. Option과 Future 함께 사용
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기