launch(), async(), runBlocking()는 코루틴 빌더를 사용한 일시 중단 알고리즘을 대부분 작성했다.
코루틴 빌더를 호출할 때 전달하는 코드는 일시 중단 람다이다. 함수에선 어떻게 일시 중단 코드를 작성할까?
suspend fun greetDelayed(delayMillis: Long) {
delay(delayMillis)
println("Hello, World")
}
일시 중단 함수르 만들려면 suspend 제어자만 추가하면 된다. 일시 중단 함수는 delay()와 같은 다른 일시 중단 함수를 직접 호출할 수 있다. 코드를 코루틴 빌더 안에 감쌀 필요가 없기 때문에 코드를 명확하고 가독성 있게 만들어준다.
fun main(args: Array<String>) {
greetDelayed(1000)
}
일시 중단 연산은 다른 일시 중단 연산에서만 호출될 수 있어서 이 코드는 컴파일 되지 않는다.
fun main(args: Array<String>) {
runBlocking {
greetDelayed(1000)
}
}
비 일시 중단 코드에서 함수를 호출하려면 다음 예와 같이 코루틴 빌더로 감싸야한다.
코루틴 빌더 대신 비동기 함수를 사용하는 쪽이 더 편리하다. 일시 중단 함수를 추가해 이 주제를 확장시켜보자.
먼저 간단한 레파지토리를 구현할 때 비동기 함수를 사용한 구현과 일시 중단 함수를 사용한 구현을 비교해보자.
잡 구현을 반환하는 함수가 있으면 어떤 시나리오에서는 편리할 수 있지만, 코루틴이 실행되는 동안에 일시 중단을 위해 join()이나 await()을 사용하는 코드가 필요하다는 단점이 생긴다. 기본 동작으로 일시 중지를 하고 싶으면 어떻게 해야 할까?
data class Profile(
val id: Long,
val name: String,
val age: Int
)