Android/Coroutine

Coroutine 기초

네모메모 2022. 7. 8. 18:26
반응형

 

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() 은 특별한 일시 중단 기능 입니다. 

특정 시간 동안 코루틴을 일시 중단 합니다. 코루틴을 일시 중단 하면 기본 스레드가 차단 되지 않지만 다른 코루틴이 실행되고 코드에 기본 스레드를 사용할 수 있습니다.

더보기

suspend fun delay(timeMillis: Long)

 

ㄴ> runBlocking { ... } 코루틴 빌더입니다. 

- 내부의 모든 코루틴이 실행을 완료할 때까지 호출하는 동안 runBlocking스레드를 실행하는 스레드(이 경우 메인 스레드)가 차단됨 을 의미

더보기

expect fun <T> runBlocking(context: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> T): T

 


 

 

 

 


[참조]

- https://kotlinlang.org/docs/coroutines-basics.html#your-first-coroutine

반응형