본문 바로가기
카테고리 없음

코루틴 알아보기 1-1

by Taron 2024. 2. 7.

전 글에서 코루틴이 무엇인지 이론적으로만 알아보았는데 이번 글에서는 간단한 예제를 같이 보면서 이해하는 시간을 가져보도록 하겠습니다.

 

바로 예제를 보면서 설명하겠습니다.

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초로 줄어든것을 확인 할 수 있습니다. 

 

간단하게 예제를 통해 코루틴을 다뤄 보았는데 코루틴을 공부하는데 도움이 되셧으면 좋겠습니다. 읽어주셔서 감사합니다.

댓글