inflearn logo
강의

講義

知識共有

2時間で終わるコルーチン

코루틴 스코프

313

lkckss123

投稿した質問数 6

0

코드를 보다보면 코루틴 스코프를 쓸 때, 소문자로 coroutineScope { } 블락이 있는 경우가 있고 대문자로 시작하는 CoroutineScope(Dispatchers.Main).launch { } 이런식으로 된 코루틴스코프가 있는데, 각각 어떤 차이이며 어느 상황에 각각을 써야하나요?

kotlin coroutine

回答 1

0

lannstark

안녕하세요! 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()
}

여기서 만약 calculateResultcoroutineScope 이 아닌 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() 같은 경우는 진작 코루틴영역이 존재하는 상황에서 앞으로 만들 몇몇 코루틴을 묶어 주고, 해당 코루틴들을 먼저 실행시키고 싶을 때 사용한다고 보시면 되겠습니다.

감사합니다! 🙏

Dispatchers 별 차이점 관련 질문

0

93

1

코루틴과 가상 스레드의 차이가 궁금합니다.

1

310

2

Coroutine과 ThreadLocal관련 질문

0

154

2

선생님 강의를 듣고 크롤링에 코루틴을 적용해보고 있습니다. 그런데 코루틴이 하나만 나와서 동시처리가 안되는데 혹시 봐주실 수 있나요??

1

115

1

7강에 대해서 궁금증이 있는데요

1

116

2

Spring MVC에서 corountine 활용 방안

1

540

1

9강 코루틴 중단과 재개관련 문의 드립니다.

0

124

2

suspend 함수에 관해 추가적인 질문 있습니다! (runcatching, Result)

0

126

1

간단 질문.. join() vs delay()

0

158

2

코루틴을 잘 사용하고 있는지 궁금합니다.

0

196

1

CoroutineScope & Dispatcher 질문

0

161

2

async await 관련 질문

1

136

2

코루틴 실행 순서 궁금합니다.

1

232

2

corutine task에 대한 질문

1

195

2

completing의 존재의의가 궁금합니다.

1

161

1

코루틴 dispatcher IO관련 질문

0

187

1

Job 질문이 있습니다

1

203

1

스프링 MVC 환경에서의 코루틴

1

2096

1

자식1, 2와 부모코루틴의 관계

1

225

1

한 suspend fun 의 반환값이 다른 suspend fun의 파라미터로 쓰일 때

1

329

2

delay 함수에 대해 질문이 있습니다

1

394

1

runBlocking을 사용하는 경우가 있을까요?

0

400

1

delay가 없으면 실행 안 되는 이유

0

295

1

CoroutineScope 와 withContext 의 차이를 잘 모르겠습니다.

1

701

1