인프런 커뮤니티 질문&답변
코루틴 스코프
작성
·
296
답변 1
0
안녕하세요! lkckss123님! 😊 앞선 질문 - https://www.inflearn.com/questions/1179607/coroutinescope-%EC%99%80-withcontext-%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%A5%BC-%EC%9E%98-%EB%AA%A8%EB%A5%B4%EA%B2%A0%EC%8A%B5%EB%8B%88%EB%8B%A4 - 에서 이어지는 것으로 생각됩니다!
CoroutineScope(Dispatchers.Main).launch { } 는 suspend 함수가 아니고, 새로운 코루틴 영역을 시작하기 위해 사용하는 것으로 알고 계실겁니다.
coroutineScope() 은 CoroutineScope()과 다르게 suspend 함수이고, 오히려 withContext()에 가깝습니다. coroutineScope() 안에 추가적인 코루틴을 만들면, 해당 코루틴들을 하나로 묶어 줄 수 있게 되죠. 다만 withContext()가 CoroutineContext를 바꾸면서 새로운 코루틴을 만들었다면, coroutineScope()은 딱히 context는 바꾸지 않습니다.
coroutineScope()은 다음 예제를 보시면 이해가 잘 되실거에요!
fun main(): Unit = runBlocking {
printWithThread("START")
printWithThread(calculateResult())
printWithThread("END")
}
suspend fun calculateResult(): Int = coroutineScope {
val num1 = async {
delay(1_000L)
10
}
val num2 = async {
delay(1_000L)
20
}
num1.await() + num2.await()
}
여기서 만약 calculateResult 를 coroutineScope 이 아닌 CoroutineScope 으로 만들려 한다면, Int 를 반환하지 못하고 Job 자체를 반환해야 할거에요!
fun main(): Unit = runBlocking {
printWithThread("START")
printWithThread(calculateResult())
printWithThread("END")
}
fun calculateResult(): Job = CoroutineScope(Dispatchers.IO).async {
val num1 = async {
delay(1_000L)
10
}
val num2 = async {
delay(1_000L)
20
}
num1.await() + num2.await() // 결과를 보고 싶다면 출력을 해야 한다!
}또한 coroutineScope 을 사용했을 때는 두 개의 async가 동작하고 덧셈 결과인 30이 출력되기 전까지 END 가 출력되지 않지만, CoroutineScope()을 사용하게 되면 START -> Job 반환 -> END 출력으로 실제 async 두 개가 동작할 때까지 대기하지 않습니다.
따라서 coroutineScope() 같은 경우는 진작 코루틴영역이 존재하는 상황에서 앞으로 만들 몇몇 코루틴을 묶어 주고, 해당 코루틴들을 먼저 실행시키고 싶을 때 사용한다고 보시면 되겠습니다.
감사합니다! 🙏





