● 코루틴(co-routine): 쓰레드보다 더욱 경량화된 동시처리 기능 (비동기프로그램)
-> 목표: 하나의 쓰레드안에서 다시 여럿의 코루틴을 나누어서 쓴다
- 운영체제의 깊이있는 지식이 없어도 쉽게 비동기 프로그래밍을 할 수 있다.
- 최적화된 비동기 함수를 사용
- 하드웨어 자원의 효율적인 할당을 가능하게 한다
- 안정적인 동시성, 비동기 프로그래밍을 가능하게 한다.
- 코루틴이 쓰레드보다 더욱 가볍게 사용할 수 있다
- 로직들을 협동해서 실행하자는게 목표이고 구글에서 적극 권장
① 스코프로 범위 지정 가능
- GlobalScope: 앱이 실행된 이후에 계속 수행되어야 할 때 사용
- CoroutineScope: 필요할 때만 실행하고 사용 후에는 정리 필요(cancel())
② 쓰레드 지정: 코루틴을 실행할 thread를 Dispetcher로 지정할 수 있다.
- Dispetchers.Main: UI와 상호작용하기 위한 메인 쓰레드
- Dispetchers.Io: 네트워크나 디스크 I/O 작업에 최적화 되어있는 쓰레드(서버작업등)
- Dispetchers.Default: 기본적으로 CPU최적화 되어있는 쓰레드
⇒ withContext: 안드로이드에서는 특히 Dispetcherks의 변환을 해야하는 작업을 고려해야한다.
(예를들어, ui가 적용되지 않는 로직들을 백그라운드에 동시적으로 실행하다가 ui에 결과값을 갱신해야하는 경우. [io->main])
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/with-context.html
③ 빌더와 함께 사용
- launch 빌더: 결과값이 없는 코루틴 빌더/ job객체로 코루틴 관리
(Job객체는 다양한 함수를 가지고 있다.
join: 현재의 코루틴이 종료되기를 기다린다.
cancel: 현재의 코루틴을 즉시 종료한다.)
- async 빌더: 결과값이 있는 코루틴 빌더 / Deffered 타입으로 값 리턴
(결과값을 리턴받아야하기 때문에 await은 일시중단이 가능한 코루틴에서 실행가능하다.)