Android/Coroutine 14

[Kotlin Coroutine][init] 5. kotlin.coroutines vs kotlinx.coroutines

코루틴은 하나의 라이브러리에 있을 것 같지만 아니다! 1) 코틀린은 언어 차원에서 표준 라이브러리에 최소한의 저수준 API만 제공하고, 2) 다양한 다른 라이브러리에서 코루틴을 활용할 수 있도록 되었다. 1) 코틀린은 언어 차원에서 표준 라이브러리인 kotlinx.coroutines - 자유도를 보장하기 위해 필수 언어 차원에서의 최소한만 지원함 ㄴ> 여기에는 suspendCoroutine, Continuation 등 ㄴ> 라이브러리 개발자에게 적합 2) 다양한 다른 라이브러리 - 별도의 의존성을 추가해야 한다. - 애플리케이션 개발자들에게 적합 - 이 중 JetBrains에서 개발한 kotlinx.coroutines에는 코루틴을 위한 많은 라이브러리가 대표적이다. ㄴ> 여기에는 launch, async..

Android/Coroutine 2024.02.22

[Kotlin Coroutines][init] 3. 코루틴 중단(suspend)하고 재개(resume)하기

코틀린 코루틴은 '비동기적인 작업을 수행할 때 사용되는 경량 스레드'입니다. 코루틴은 실행 중인 함수의 실행을 일시 중단하고 나중에 재개할 수 있는 기능을 제공하여 비동기적인 작업을 보다 효율적으로 관리할 수 있습니다. 이러한 일시 중단과 재개는 코루틴의 핵심 개념 중 하나인 "중단 함수"를 통해 이루어집니다. 중단 함수(suspend function) 코루틴을 중단 할 수 있는 함수 (= 코루틴에서 함수의 실행을 일시 중단하고 나중에 재개할 수 있는 기능을 제공하는 함수) 코루틴을 중단할 수 있으므로 중단 함수는 반드시 코루틴(또는 다른 중단함수)에 의해 호출되어야 한다. 중요하다 (코틀린 코루틴의 핵심적인 개념) [비유] 비디오 게임을 하다가 멈추는 상황이랑 비슷하다. 체크 포인트에서 게임을 저장하고..

Android/Coroutine 2024.02.18

[Kotlin Coroutines][init] 2. 시퀀스 빌더

다른 언어에서는 코루틴을 어떻게 사용할까?? 🤔 파이썬이나 자바스크립트를 보면 아래 2가지 같은 제한된 형태의 코루틴이 있다고 한다. 비동기 함수 (async/await와 같은 호출 방식) 제너레이터(값을 순차적으로 반환) 코틀린에서는 제너레이터 대신 시퀀스를 생성할 수 있는 시퀀스 빌더라는 것을 대신 제공한다. (Flow 빌더도 있으나 내용이 많아 추후 포스팅 예정) 시퀀스 빌더 - 시퀀스는 List, Set 같은 컬렉션과 비슷한 개념이지만 필요할 때마다 값을 하나씩 계산하는 지연 처리를 한다. - [시퀀스의 특징] 요구되는 연산을 최소한으로 수행 무한정이 될 수 있음 메모리 사용이 효율적 (이펙티브 코틀린에 Item49 '하나 이상의 처리 단계를 가진 경우 시퀀스를 사용라라'고 있으니 참고) - [시..

Android/Coroutine 2024.02.18

[Coroutine] async{}/await() 사용 시 주의사항

아래 두 코드는 다른 방식으로 동작합니다. 1) async { api호출함수() }을 여러 개 사용 후, await() 여러 개를 호출하는 코드 vs 2) async { api호출함수() }.await() 여러 개를 바로 호출하는 코드 1) async { api호출함수() }을 여러 개 사용 이후, await() 여러 개를 호출하는 코드 - getUserApi()와 getPeedApi()를 병렬로 호출하고, 각각의 작업이 완료될 때까지 대기합니다. 따라서 getUserApi()와 getPeedApi() 함수 호출은 동시에 이루어질 수 있으며, 두 작업이 완료되는 순서에 따라 데이터를 받습니다. suspend fun fetchData() { coroutineScope { val userDeferred = ..

Android/Coroutine 2024.02.18

[Kotlin Coroutine][init] 1.코틀린 코루틴? 왜 꼭 코루틴을 사용해야하나요?

* 작성 내용 : 코틀린 코루틴이란 무엇인지? 어떻게 작동하는지?? Kotlin + Coroutines 을 같이 사용하는 장점 멀티플랫폼 작동 가능 (JVM, JS, iOS 등의 모듈들에서 가능) ㄴ> 이건 코틀린 멀티플랫폼(kotlin multiplatform)의 영향이 큼 : kotlinlangSite, ,jetbrains androidDeveloper ㄴ> 더보기 안드로이드에서 코루틴을 왜 사용해야하는지? - 안드로이드에서는 메인스레드 단 하나만 뷰를 다룰 수 있음 -> 이 쓰레드가 블로킹되면 앱이 ANR 발생하며 죽음 "안드로이드에서는 하나의 앱에서 뷰를 다루는 스레드가 '단 하나'만 존재하기 때문에 Main 스레드를 블로킹되서는 안된다." - 하지만, 뷰를 다루는 작업은 엄청 많음 -> 따라서,..

Android/Coroutine 2024.02.17

[코루틴 기초] Coroutine Builder (=코루틴 빌더)

Coroutine Builder (=코루틴 빌더) : 코루틴을 생성할 때 사용하는 여러 함수들을 일컫는 말 공통적인 라이프사이클 및 context가 정해진 몇몇 작업 등 구체적인 영역 안에서만 코루틴을 적용하므로 대표적인 함수들은 아래와 같다. Coroutine Builder 대표적 함수들(=코루틴 생성함수) cf) coroutineScope, withContext 등은 CoroutineScope 함수이다. 1. launch { .. } - 새 코루틴을 생성하고 바로 실행 - Job을 리턴함 cf) async public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = C..

Android/Coroutine 2022.07.09

[코루틴 기초] suspend 함수 (= 일시 중단 함수, suspend fuction)

suspend 함수 (= 일시 중단 함수, suspend fuction) : 함수 호출 시 런타임 context를 저장 및 코루틴 실행을 일시중지하고, 나중에 필요한 시점에 다시 진행할 수 있는 함수 = 현재 스레드를 block 시키지 않고 자신을 호출한 함수를 일시 중단 시키면서도 다른 작업을 수행할 수 있다. - suspend 키워드를 붙임 - 다른 suspend 함수에서 호출하거나 코루틴 빌더에서만 호출할 수 있다. - ex) 코루틴의 delay() 함수 public suspend fun delay(duration: Duration): Unit = delay(duration.toDelayMillis()) [참조] - https://kotlinlang.org/docs/coroutines-basics...

Android/Coroutine 2022.07.08

[코루틴 기초] CoroutineContext (=코루틴 문맥, 코루틴 컨텐스트)

CoroutineContext : 코루틴의 동작을 정의하는 요소 집합 더보기 안드로이드에서 컨텍스트(Context) 처럼 코루틴의 Context라고 이해하면 쉽다. +) 안드로이드에서 컨텍스트(Context) 무엇인가? 이름 그대로 해석한다면 애플리케이션(객체)의 현재 상태의 맥락(context)를 의미합니다. 컨텍스트는 새로 생성된 객체가 지금 어떤 일이 일어나고 있는지 알 수 있도록 합니다. 따라서 액티비티와 애플리케이션에 대한 정보를 얻기 위해서는 컨텍스트를 사용하면 됩니다. - 코루틴의 영구적 context로 코루틴에서 사용할 여러 정보값들을 가지고 있다. - 코루틴마다 ConroutineContxt 인터페이스로 표현되는 context과 연관되어 있다. - 코루틴 영역(CoroutineScope)..

Android/Coroutine 2022.07.08

[코루틴 기초] Job

Job : '코루틴의 핸들'로 실행 중인 취소가능한 작업을 표현 - 코루틴을 고유하게 식별하고 수명 주기를 관리한다. - '코루틴 빌더' 실행 시 생성된다. => launch 또는 async로 만드는 각 코루틴은 Job 인스턴스를 반환 - 백그라운드 작업 - Job을 CoroutineScope에 전달하여 코루틴의 수명 주기를 추가로 관리 가능 ex) class ExampleClass { ... fun exampleMethod() { // Handle to the coroutine, you can control its lifecycle val job = scope.launch { // New coroutine } if (...) { // Cancel the coroutine started above, th..

Android/Coroutine 2022.07.08

[코루틴 기초] CoroutineScope (=코루틴 영역, 코루틴 스코프)

CoroutineScope : (코루틴의 라이프사이클을 시작하고 제어하기 위해 생성되는) 코루틴 지정 범위 ㄴ> Ex) CoroutineScope가 전역 역역(global scope)인 경우(= 코루틴의 전역 영역에서 실행된 경우), -> 코루틴의 생명주기가 전체 어플리케이션의 생명주기에 의해서만 제약되는 영역이 된다. - (CoroutineScope의 확장 함수인) 'launch' 또는 'async'를 사용하여 코루틴 실행 및 생성한 모든 코루틴을 추적함 cf) 디스패처와 달리 CoroutineScope는 코루틴을 실행하지 않는다. 더보기 BuildersKt.class public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutin..

Android/Coroutine 2022.07.08

Coroutine 예제로 개념잡기

안드로이드 공식문서 예제 따라하는 포스팅입니다. 1. 백그라운드 스레드에서 실행 예제 - '네트워크 요청' 작업은 작업이 지연되거나 부하되는 경우 문제가 되므로 이 작업을 코루틴에서 백그라운드 스레드에서 이 작업을 실행해보고자 한다. ▽ 네트워크 요청을 기본 스레드에서 했을 때 위험상황 더보기 기본 스레드에서 네트워크 요청을 보내면 응답을 받을 때까지 스레드가 대기하거나 차단됩니다. 스레드가 차단되는 경우 이로 인해 OS는 onDraw()를 호출할 수 없으므로 앱이 정지되고 애플리케이션 응답 없음(ANR) 대화상자가 표시될 수 있습니다 위와 같은 문제를 가진 코드가 아래와 같으며 문제해결을 위해 코루틴을 적용한다. ▽ 1) 네트워크 요청 작업 (@Repository클래스) sealed class Resu..

Android/Coroutine 2022.07.08

Coroutine 기초

Coroutine 이란? : 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴 - 코루틴 은 일시 중단 가능한 계산의 인스턴스 코드의 나머지 부분과 동시에 작동하는 코드 블록을 실행한다는 점에서 개념적으로 스레드와 유사합니다. - 그러나 특정 스레드에 바인딩되지 않습니다(스레드 단위와 관련없음!) 한 스레드에서 실행을 일시 중지하고 다른 스레드에서 다시 시작할 수 있고, 한 스레드 내에서 여러 코루틴이 실행되기도 한다. - 실행을 일시중단 했다가 나중에 중단 시점부터 다시 실행 재개할 수 있다. - 모든 코루틴은 범위(Scope) 내에서 실행해야 합니다. 필요성 - 스레드는 값비싼 리소스이고 스레드를 차단하는 것은 비효율적이고 종종 바람직하지 않기 때문에..

Android/Coroutine 2022.07.08