전 글에서 코루틴이 무엇인지 이론적으로만 알아보았는데 이번 글에서는 간단한 예제를 같이 보면서 이해하는 시간을 가져보도록 하겠습니다.
바로 예제를 보면서 설명하겠습니다.
Log.d(TAG, "onCreate: start")
GlobalScope.launch {
delay(300L)
Log.d(TAG, "onCreate: coroutine: sleep")
}
Log.d(TAG, "onCreate: End")
위 코드에서 GlobalScope.launch는 코루틴을 시작하겠다는 의미이고 { } 안에 있는 코드가 비동기적으로 실행된다는 의미입니다.
코루틴을 사용하지 않았다면 start -> sleep -> End 가 순서대로 출력되었겠지만 코루틴을 사용함으로써 메인 쓰레드와 분리되어
start -> End -> sleep 이 출력되는것을 예측할 수 있습니다.
실제로 결과를 확인하면 예측한대로 출력되어있는것을 확인할 수 있습니다.
그렇다면 만약에 비동기에서 받아와야 하는 데이터가 밑 코드에서 사용하는 데이터라면 runtime 오류를 발생 시키겠죠? 이럴땐
runBlocking 을 사용하면 됩니다!
Log.d(TAG, "onCreate: start ")
runBlocking {
delay(300L)
Log.d(TAG, "onCreate: coroutine sleep")
}
Log.d(TAG, "onCreate: End")
위 코드를 사용하면 start -> sleep -> End 가 출력되는것을 예측할 수 있습니다.
결과를 확인하면 0.3 초를 기다렸다가 밑에 코드를 실행시키는것을 확인할 수 있습니다.
다음으론 비동기로 데이터를 반환받고 그 반환받은 데이터를 출력하는 예제를 확인해보겠습니다.
아래 예제는 함수를 호출하는데 한 함수에서는 2초를 기다리고 다른 함수에서는 3초를 기다렸다가 데이터를 반환하는데 반환받은 데이터를 더해서 출력하는 예제입니다.
GlobalScope.launch{
val time = measureTimeMillis {
val one = async { doSomethingUsefulOne() }
val two = async { doSomethingUsefulTwo() }
Log.d(TAG, "더한 값: ${one.await() + two.await()}")
}
Log.d(TAG, "실행 시간: ${time} ms")
}
suspend fun doSomethingUsefulOne(): Int {
delay(2000)
return 13
}
suspend fun doSomethingUsefulTwo(): Int {
delay(3000)
return 29
}
위 코드에 suspend는 일시중단이 가능하다는 의미를 가지고있습니다.
실행 결과를 확인하면 13 과 29를 더해서 42를 출력하는것을 확인 할 수 있었습니다. 코루틴을 사용하지 않았다면 5초를 기다렸다가 출력을 했을텐데 코루틴을 사용해서 실행시간이 3초로 줄어든것을 확인 할 수 있습니다.
간단하게 예제를 통해 코루틴을 다뤄 보았는데 코루틴을 공부하는데 도움이 되셧으면 좋겠습니다. 읽어주셔서 감사합니다.
댓글