Option과 Future 함께 사용
모나드형 연결을 알아봅니다
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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- for 구문 풀어쓰기
- if로 필터링
- 여러 생성기
- Option과 Future 함께 사용