-
[코루틴] 코틀린(Kotlin)의 코루틴(Coroutine)Android 2021. 8. 27. 22:07728x90
안드로이드에서 비동기 처리하는데는 몇가지 방법이 있다.
- Rx는 다양한 기능을 제공하지만 진입 장벽이 높다. AsyncTask 는 Deprecated 되었고 복잡하다.
- 코루틴은 비동기스럽지 않게 생긴 코드로, 메모리를 효율적으로 사용하면서 손쉽게 비동기 처리를 할 수 있다.
- 코루틴은 스레드 위에서 실행되는데, 코루틴 1을 실행하던 중 2가 실행되어도 실행중인 스레드를 정지하면서 컨텍스트 스위칭 개념으로 다른 스레드로 전환하는 것이 아니라, 기존 스레드를 유지하며 기존 스레드에서 코루틴 2를 실행하게 된다.
주요 키워드
suspend
- 코루틴 안에서 suspend 함수가 호출될 경우 이전까지의 코드 실행이 멈추며 suspend 함수가 처리 완료된 후, 멈춰있던 원래 스코프의 다음 코드가 실행된다.
- 코루틴을 정지하면 현재 스택 프레임이 복사되고 저장된다. 재개되면 스택 프레임이 저장된 위치에서 다시 복사되고 함수가 다시 실행된다.
- suspend 함수가 실행되면서 호출한 쪽의 코드는 잠시 멈추지만 스레드를 차단하지 않는다.
Dispatcher
코루틴 실행에 사용되는 스레드를 확인한다.
- Dispatchers.Default : 안드로이드 기본 스레드풀 사용. CPU 사용량이 많은 작업에 사용
- Dispatchers.IO : 네트워크, 디스크 사용 할때 사용. (네트워크, 디스크, DB 작업)
- Dispatchers.Main : 안드로이드의 경우 UI 스레드를 사용합니다.
withContext
- 콜백을 도입하지 않고도 코드 줄의 스레드 풀을 제어할 수 있다.
- withContext 는 콜백 기반 구현에 비해 오버헤드가 적다. 네트워크 라이브러리에서 withContext()를 여러 번 사용하더라도 동일한 디스패처에 유지되고 스레드가 전환되지 않는다. (반드시 동일한 스레드라는 보장은 없음)
코루틴 시작 - launch & async
- 사용할 Dispatcher 를 결정하고
- Dispatcher 를 이용해서 CoroutineScope 만들고
- CoroutineScope 의 launch 또는 async 에 수행할 코드 블록을 넘기면 됩니다.
launch 와 async 는 CoroutineScope 의 확장함수 이며, 넘겨 받은 코드 블록으로 코루틴을 만들고 실행해주는 코루틴 빌더
- launch : Job 객체를 반환하며, 새 코루틴을 시작하고 호출자에게 결과를 반환하지 않음
- async : Deferred 객체를 반환 하며, 새 코루틴을 시작하고 await 정지함수로 결과를 반환하거나, 작업이 끝나기를 대기하거나, 취소하는 등의 제어가 가능
CoroutineScope
코루틴의 범위, 코루틴 블록을 묶음으로 제어할수 있는 단위
launch 또는 async 를 사용하여 만든 코루틴을 추적하며, 실행중인 코루틴은 언제든지 scope.cancel() 로 취소 가능
- GlobalScope : 앱의 생명주기와 함께 동작하므로 시작 ~ 종료까지 긴 기간 실행되는 코루틴의 경우 적합.
- CoroutineScope : Dispathcer 를 지정하여 코루틴이 실행될 스레드를 지정할 수 있음.
- ViewModelScope
CoroutineContext
다음 요소들로 코루틴의 동작을 정의
새 CoroutineContext 를 launch 또는 async 함수에 전달하여 상속된 요소를 재정의할 수 있음.
- Job : 코루틴의 수명 주기를 제어
- CoroutineDispatcher : 적절한 스레드에 작업을 전달
- CoroutineName : 디버깅에 유용한 코루틴의 이름
- CoroutineExceptionHandler : 포착되지 않은 예외 처리
참고
728x90'Android' 카테고리의 다른 글
[Android] MVC vs MVP vs MVVM (0) 2021.08.29 [Android] Android HTTP 통신 (Retrofit, HttpUrlConnection) (0) 2021.08.28 [Android] RxJava (0) 2021.08.28 [코루틴] 코루틴(Coroutine) 이란 (0) 2021.08.22 Android Developer Roadmaps 2020 (0) 2020.12.05