비동기 처리를 위해서 새로운 Thread 를 생성하거나 Rxjava 를 주로 활용했었는데요, 우연히 Coroutine 에 대해서 알게 되었고  이번 기회에 Coroutine 대해서 공부하면서  개인적으로 중요하다고 생각했던 포인트를 요약 정리하였습니다...

[안드로이드] 코틀린 코루틴 (Coroutine) 요약 정리

비동기 처리를 위해서 새로운 Thread 를 생성하거나 Rxjava 를 주로 활용했었는데요,

우연히 Coroutine 에 대해서 알게 되었고 

이번 기회에 Coroutine 대해서 공부하면서 

개인적으로 중요하다고 생각했던 포인트를 요약 정리하였습니다.


 

 

 

1. 코루틴 (Coroutine) 이란?

"코루틴은 간소화된 방법으로 비동기적인 실행이 가능하고, 

단일 스레드에서 여러 코루틴을 실행 할 수 있습니다."

 

 

 

 

2. 단일 스레드에서 여러 코루틴 실행..?

코루틴의 특징 중에 하나로 그림을 통해서 확인해보니 이해가 쉬웠습니다.

두 개의 새로운 Thread 를 생성하고 비동기적인 실행 시켰다고 가정하면 아래와 같은 그림을 가집니다.


 

코루틴의 경우는 아래와 같이 하나의 쓰레드 안에 여러 코루틴을 비동기적인 실행 시킬 수 있는 특징을 가집니다.




 

 

 

3. 코루틴 스코프 (CoroutineScope)

코루틴을 사용하는데 있어 CoroutineScope 를 활용합니다.

CoroutineScope 의 인자로는 CoroutineContext 을 가지는데, 

이를 통해 실행할 작업이 어떤 스레드에 배정할지 결정합니다.

private val coroutineScope = CoroutineScope(Dispatchers.Default)
private val coroutineScopeMain = CoroutineScope(Dispatchers.Main)
private val coroutineScopeIO = CoroutineScope(Dispatchers.IO

 

 - Dispatchers.Default : 복잡한 연산 작업에 사용

 - Dispatchers.Main : UI 동작에 사용

 - Dispatchers.IO : 파일 입출력에 사용

 

 

 

 

4. 코루틴 스코프 (CoroutineScope) 빌더

스레드를 배정하고 생성까지 했다면 이제 실행까지 시켜야 하는데요,

CoroutineScope 을 실행하는데 있어 제공되는 빌더들이 있습니다.

 

첫 번째 빌더로는 launch 가 있습니다.

배정된 스레드에서 비동기적으로 실행시켜 줍니다.

coroutineScope.launch {
var count = 0
while (true) {
delay(1000L)
Log.d("TEST", "coroutineScope : ${count++}, currentThread ID : ${Thread.currentThread().id}")
}
}

 

두 번째 빌더로는 async 가 있습니다.

배정된 스레드에서 비동기적으로 실행시키며 반환값을 가집니다. 

await 를 통해 반환 값을 기다릴 수 있습니다.

coroutineScopeMain.launch {
val deferred = async {
delay(2000L)
"Completed"
}

binding.tvTitle.text = deferred.await()
}

await 사용 시 체크 할 점이 하나 있는데,

await 는 반환 값을 기다려야 된다는 특성 때문에 반드시 코루틴 내부 또는 suspend function 을 통해 호출되어야 합니다.

suspend function 통해 호출 시키는 부분은 바로 다음 내용에서 확인 가능합니다.

 

 

 

5. Suspend Function 활용

코루틴 사용에 있어서 suspend Function 이 아래와 같이 활용 할 수 있습니다.

 - 일정시간 대기상태 만들기

private suspend fun pause(timeMillis: Long) {
delay(timeMillis)
}
coroutineScope.launch {
pause(5000L)

...
}

 

 - 반환 값을 기다려야 할 때 : await 

(suspend function 을 사용했을 때 조금 더 가독성이 좋아 보이네요.)

private suspend fun getCompletedText(): Deferred<String> {
return coroutineScope.async {
delay(2000L)
"Completed"
}
}
coroutineScopeMain.launch {
binding.btnStop.text = getCompletedText().await()
}

 

 

 

 

 

6. 끝으로..

개인적으로 코루틴에 대해 공부하면서 요약 정리를 해보았는데요.

좀 더 세부적인 내용은 공식 문서 또는 여러 블로그를 추가로 참조하시면 좋을 것 같습니다.

부족하지만 끝까지 읽어주셔서 감사합니다 :)

 

 

 

 

[Reference]

Android  Developer

코틀린 코루틴 한번에 끝내기

Kotlin coroutine 사용방법

 

 

 

 

0 comments: