Coroutine 이란?
: 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴
- 코루틴 은 일시 중단 가능한 계산의 인스턴스
코드의 나머지 부분과 동시에 작동하는 코드 블록을 실행한다는 점에서 개념적으로 스레드와 유사합니다.
- 그러나 특정 스레드에 바인딩되지 않습니다(스레드 단위와 관련없음!) 한 스레드에서 실행을 일시 중지하고 다른 스레드에서 다시 시작할 수 있고, 한 스레드 내에서 여러 코루틴이 실행되기도 한다.
- 실행을 일시중단 했다가 나중에 중단 시점부터 다시 실행 재개할 수 있다.
- 모든 코루틴은 범위(Scope) 내에서 실행해야 합니다.
필요성
- 스레드는 값비싼 리소스이고 스레드를 차단하는 것은 비효율적이고 종종 바람직하지 않기 때문에
- 스레드를 블럭하고 재실행하려면 시스템 수준에서 계산 비용이 많이드는 Cotext swith(문맥 전환)을 해야 하므로 성능에 안 좋을 수 있어 비동기 프로그래밍을 이용한 효율적 접근 필요
- ex 상황)
기본 스레드에서 네트워크 요청을 보내면 응답을 받을 때까지 스레드가 대기하거나 차단됩니다. 스레드가 차단되는 경우 이로 인해 OS는 onDraw()를 호출할 수 없으므로 앱이 정지되고 애플리케이션 응답 없음(ANR) 대화상자가 표시될 수 있습니다.
=> 스레드가 자원이 많이들고 성능에 부정적인 영향을 미칠 수 있으므로
=> Kotlin 코루틴을 사용하면 네트워크 호출이나 디스크 작업과 같은 장기 실행 작업을 관리하면서 앱의 응답성을 유지하는 깔끔하고 간소화된 비동기 코드를 작성할 수 있습니다.
안드로이드에서 Coroutine 이란?
- Android의 비동기 프로그래밍에 권장되는 솔루션
- Kotlin 버전 1.3에 추가되었으며 다른 언어에서 확립된 개념을 기반으로 합니다.
- ViewModel에는 코루틴과 직접 연동되는 KTX 확장 프로그램 집합이 포함됩니다. (이러한 확장 프로그램은 lifecycle-viewmodel-ktx 라이브러리이며, 이 가이드에서 사용됩니다.)
안드로이드에서 코틀린 사용 시
- 앱의 build.gradle 파일에 다음 종속 항목을 추가합니다. (최신이 아닐 수 있어 공식문서 확인필요합니다.)
dependencies {
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.2'
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.3")
}
1) kotlinx.coroutines
: JetBrains에서 개발한 코루틴을 위한 풍부한 라이브러리
- 여러 고급 코루틴 사용 기본 요소가 포함. ex) launch, async
- kotlinx-coroutines-core 종속성 추가 필요.
2) kotlinx.coroutines.android
- Android 프로젝트에서 코루틴을 사용하기 위한 라이브러리
안드로이드에서 Coroutine 기능
- 경량: 코루틴을 실행 중인 스레드를 차단하지 않는 정지를 지원하므로 단일 스레드에서 많은 코루틴을 실행할 수 있습니다. 정지는 많은 동시 작업을 지원하면서도 차단보다 메모리를 절약합니다.
- 메모리 누수 감소: 구조적 동시성(Structured concurrency)을 사용하여 범위 내에서 작업을 실행합니다.
ㄴ> 구조적 동시성 : 새로운 코루틴은 코루틴의 수명을 제한 하는 특정 CoroutineScope 에서만 시작될 수 있습니다 . - 기본으로 제공되는 취소 지원: 실행 중인 코루틴 계층 구조를 통해 자동으로 취소가 전달됩니다.
- Jetpack 통합: 많은 Jetpack 라이브러리에 코루틴을 완전히 지원하는 확장 프로그램이 포함되어 있습니다. 일부 라이브러리는 구조화된 동시 실행에 사용할 수 있는 자체 코루틴 범위도 제공합니다.
Coroutine 예제 샘플
fun main() = runBlocking { // 이것: CoroutineScope
launch { // 새 코루틴을 시작하고 계속
delay(1000L) // 1초 동안 비차단 지연(기본 시간 단위는 ms)
println("World!") // 지연 후 인쇄
}
println("Hello") // 메인 코루틴은 이전 코루틴이 지연되는 동안 계속됩니다.
}
ㄴ> 아래와 같은 순서로 출력됨
Hello
World!
ㄴ> launch { .. } 는 코루틴 빌더 입니다.
독립적으로 계속 작동하는 나머지 코드와 동시에 새 코루틴을 시작합니다. 그래서 Hello먼저 인쇄한 것입니다.
fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit): Job
ㄴ> delay() 은 특별한 일시 중단 기능 입니다.
특정 시간 동안 코루틴을 일시 중단 합니다. 코루틴을 일시 중단 하면 기본 스레드가 차단 되지 않지만 다른 코루틴이 실행되고 코드에 기본 스레드를 사용할 수 있습니다.
ㄴ> runBlocking { ... } 도 코루틴 빌더입니다.
- 내부의 모든 코루틴이 실행을 완료할 때까지 호출하는 동안 runBlocking스레드를 실행하는 스레드(이 경우 메인 스레드)가 차단됨 을 의미
expect fun <T> runBlocking(context: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> T): T
[참조]
- https://kotlinlang.org/docs/coroutines-basics.html#your-first-coroutine
-