우리는 지금까지 예제에서 코루틴을 실행할 때 async를 사용해 suspend function을 실행해왔다.
명확히 하자면 이번 제목이 코루틴을 실행하는데 필요한 녀석이다.
그래서 뭐임?
Coroutine Builder(코루틴 빌더)는 새로운 코루틴을 만들기 위해 필요한 녀석이다.
총 3가지 빌더가 있고 launch, async, runBlocking이 있다.
먼저 launch를 사용해보려고 한다.
launch 사용하기
fun main() {
launch {}
}
단순히 이렇게 사용할 순 없다.
launch는 최상위 함수가 아닌 CoroutineScope의 확장함수이기 때문이다.
이렇게 launch를 사용하려면 새로운 CoroutineScope가 필요하다.
launch는 대체 어떤 경우에 사용하는 걸까?
코루틴 외부에서 코루틴 결과물에 접근할 필요가 없을 때 사용한다.
반면에 코루틴 결과물에 접근할 필요가 있을 때는 무엇을 사용할까?
바로 async를 사용하면 된다.
하지만 이번엔 다른 코루틴 빌더인 runBlocking을 사용해보자.
runBlocking 사용하기
runBlocking은 아래처럼 사용할 수 있다.
fun main() {
runBlocking {
launch {
// ... some code
}
}
}
조금 생각해보면 runBlocking은 launch와 다른 점이 있다.
이 녀석은 일반 함수처럼 호출했기 때문이다.
가능한 이유가 뭘까?
runBlocking은 내부적으로 CoroutineScope를 가지고 있기 때문이다.
launch 추가 설명
launch 코루틴 빌더를 사용하면 Job 객체를 리턴한다.
그리고 이 Job 객체를 사용하여 launch로 만들어진 코루틴의 상태를 확인할 수 있고, 취소시킬 수 있다.
게다가 Job 객체로 코루틴 간의 부모-자식 계층을 만들 수 있다.
두 코드를 가지고 실행 결과를 비교해보자.
fun main() = runBlocking {
val job = launch {
networkRequest()
println("result received")
}
println("end of runBlocking")
}
이 코드는 예상하다시피 Job 객체를 사용해 어떤 계층을 만들지 않은 코드이다.
실행 결과는 어떻게 될까?
...
end of runBlocking
result received
...
위처럼 나오게 된다.
그럼 두 print문이 순서대로 출력되도록 만드려면 어떻게 해야할까?
fun main() = runBlocking {
val job = launch {
networkRequest()
println("result received")
}
job.join()
println("end of runBlocking")
}
이 코드를 실행하게 되면 runBlocking에서 launch로 실행된 코루틴이 종료될 때까지 기다리게 된다.
또다른 launch가 제공하는 기능 중 흥미로운 옵션은 코루틴을 늦게 시작하는 기능이다.
기본적으로는 코루틴이 바로 시작되지만,
start 파라미터에 CoroutineStart.LAZY를 설정해주면 어디서 코루틴을 시작할 지 정할 수 있다.
fun main() = runBlocking {
val job = launch(start = CoroutineStart.LAZY) {
networkRequest()
println("result received")
}
delay(200)
job.start()
println("end of runBlocking")
}
이렇게 Job 객체에 start() 메소드를 사용하면 된다.
위 코드에서는 200밀리초 동안 기다린 후 해당 코루틴을 시작하고 있다.
'Language > Kotlin' 카테고리의 다른 글
Coroutines 기본적인 에러 처리하기(feat. try-catch) (0) | 2024.05.08 |
---|---|
Coroutines의 Main safety (0) | 2024.05.07 |
Coroutines의 내부 동작 (0) | 2024.03.07 |
Coroutines을 다른 스레드에서 실행하기 (0) | 2024.03.03 |
Blocking vs Suspending 차이점 (0) | 2024.03.01 |