목차
코루틴(coroutine)이란?
코루틴은 루틴(routine)의 일종으로서, 협동(co)루틴 이라고도 합니다.
루틴은 규칙적으로 반복되는 일의 순서를 뜻하는데요, 코루틴은 두 루틴 이상이 서로 대등한 관계에서, 서로가 서로를 호출하는 방식으로 작동합니다. 예를 들어, A와 B라는 루틴이 있다고 가정했을 때, A 루틴 입장에서는 B가 서브 루틴입니다. B 루틴 입장에서는 A가 서브 루틴입니다.
어떠한 코루틴이 발동될 때 마다 해당 코루틴은 이전에 자신의 실행이 마지막으로 중단되었던 지점 다음의 장소에서 실행을 재개한다.
안드로이드에서 코루틴은 다음 두 가지 문제를 해결하는 데 도움이 된다.
- 기본 스레드를 차단하여 앱이 정지될 수 있는 장기 실행 작업 관리
- 기본 스레드에서(메인 스레드 / UI 스레드) 네트워크 또는 디스크 작업을 안전하게 호출하는 기능 제공.
Android의 모든 앱에는 UI를 처리하고 상호작용 관리하는 기본 스레드가 있다.(메인 스레드)
기본 스레드에 너무 많은 작업을 할당하게 되면 앱이 느리게 되는 현상이 발생할 수 있기 때문에 다른 스레드로 처리르 해주어야 한다.
코틀린 코루틴은 디스패처를 사용하여 코루틴 실행에 사용되는 스레드를 결정한다.
1. Dispatcher
Dispatcher : 코루틴 실행에 사용되는 스레드 설정.
모든 코루틴은 메인 스레드에서 실행되더라도 디스패처 내부에서 실행되어야 한다.
- Dispatcher.Main : 메인 스레드에서 코루틴 실행(UI 작업 등)
- Dispatcher.IO : 메인스레드가 아닌 외부 스레드에서 디스크/네트워크 IO를 수행하는데 최적화
- Dispatcher.Default : CPU를 많이 사용하는 작업
2. CoroutineScope - 하나 이상의 관련 코루틴 관리
코루틴을 정의할 때는 코루틴 스코프도 함께 지정해야 한다.
코루틴 스코프는 해당 코루틴들의 상태를 알고 있다.
중단 된 코루틴을 재개할 때 어디서 시작할지 등의 상태.
3. 코루틴 시작하기
코루틴의 시작은 다음과 같이 두 가지 방법이 있다.
- launch : 새 코루틴 시작. 호출자에게 결과 반환 X
- async : 새 코루틴 시작, await 정지함수 사용, result 반환.
**병렬분해 : suspend 함수에 의해 시작되는 모든 코루틴은 함수가 반환되면 중지되어야 한다.
반환 전에 코루틴이 완료되도록 보장되어야 한다**
지연된 참조에 대해 await를 호출하여 값을 반환하기 전에 코루틴이 완료되도록 보장할 수 있다.
- suspend function / RxJava, LiveData 사용 -> Room이 Main-safety를 제공한다.
- Retrofit / Volley -> 자체적으로 백그라운드 작업 처리를 제공하기 때문에 코루틴이 필요하지 않다.
실습을 통한 이해는 추후에 다루도록 하겠다.
'Develop > Android' 카테고리의 다른 글
Android Room에 코루틴과 LiveData 적용해보기 (0) | 2020.04.28 |
---|---|
MPAndroidChart 라이브러리를 활용한 BarChart 그리기 (19) | 2020.04.26 |
android Room 사용하기 (0) | 2020.04.06 |
세로 방향 뷰페이저 적용하기 - Vertical ViewPager (Kotlin) (0) | 2019.12.22 |
TabLayout과 ViewPager 연동하기 (0) | 2019.12.21 |