0. 정의

Kotlin 코루틴으로 앱 성능 향상  |  Android Developers

[Coroutine] 5. suspend fun의 이해

suspend function == 일시중단 함수

suspend fun으로 선언되는 일시 중단 함수는 함수 내에 일시 중단 지점을 포함할 수 있는 특별한 함수!


1. 이해해보기

fun main() = runBlocking<Unit> {
    delay(100L)
    println("Hello Coroutines")
    delay(100L)
    println("Hello Coroutines")
}

홀로 Kotlin을 공부할 때 많이 봤던 조세영 님의 Kotlin World를 참고했다.

상기 코드에서 반복되는 부분을 따로 function으로 빼줄 수 있는데……

그냥 빼면 delay 함수는 suspend function 내에서만 선언될 수 있다는 오류가 발생하게 된다.

suspend를 붙여주자.

fun main() = runBlocking<Unit> {
    delayAndPrintHelloCoroutines()
    delayAndPrintHelloCoroutines()
} -> 220ms

suspend fun delayAndPrintHelloCoroutines() {
    delay(100L)
    println("Hello Coroutines")
}

이러면 우리가 기대하는 대로 100ms만에 print가 2번 찍혀야하는데, 실제로는 200ms가 그대로 소요된다.

일시 중단 함수가 호출된다 해서 새 코루틴이 생기는 것은 아니라고 한다. 하나의 코루틴 내에서 저 함수들이 쭉 실행되기 때문이다.

fun main() = runBlocking<Unit> {
    val startTime = System.currentTimeMillis()
    val job1 = launch {
        delayAndPrintHelloCoroutines()
    }
    val job2 = launch {
        delayAndPrintHelloCoroutines()
    }
    job1.join()
    job2.join()
    println("${System.currentTimeMillis() - startTime}") -> 110ms
}

일시 중단 함수가 새 코루틴에서 실행되려면, 상기 코드처럼 launch나 async같은 코루틴 빌더로 감싸면 된다!

그럼 우리가 기대하는 것처럼 병렬로 실행되어 실행 시간이 100ms 언저리가 나온다.