-
[Android] Kotlin의 coroutine안드로이드 2022. 1. 20. 15:00728x90반응형
Coroutine이란 (co(동시에) + routine)
Coroutine은 일시 중단이 가능한 작업 객체라는 의미를 가지고 있습니다. 즉 비동기적으로 실행되는 코드를 단순화하기 위해 Android에서 사용할 수 있는 동시성 디자인 패턴 중 하나입니다. Android에서의 Coroutine은 기본 스레드를 차단하고 앱이 응답하지 않게 만들 수 있는 장기 실행 작업을 관리하는데 도움이 됩니다.
반응형특징🔥
- 경량화 : Coroutine이 실행 중인 Thread를 차단하지 않는 서스펜션 지원(많은 동시 작업을 지원하면서도 차단보다 메모리를 절약)으로 인해 단일 Thread에서 많은 Coroutine을 실행할 수 있습니다.
- 메모리 누수 감소 : 구조화된 동시성(새로운 Coroutine 객체는 반드시 Coroutine의 수명을 제한하는 특정 'Coroutine Scope' 내에서 실행되어야 한다는 원칙)을 사용해 범위 내에서 작업을 실행합니다.
- 내장된 취소 지원 : 취소는 실행 중인 Coroutine 계층을 통해 자동으로 전파됩니다
- Jetpack 통합 : 많은 Jetpack 라이브러리에는 전체 Coroutine 지원을 포함하고 있습니다.
Thread와의 차이
먼저 둘의 공통점은 비동기 작업을 위해 사용한다는 점입니다. 여기서 비동기 작업이란 어떤 작업을 수행할 때, 이가 끝나는 것을 기다리지 않고 다른 작업을 수행하는 것입니다.
그런데, Thread와 Coroutine은 이러한 비동기 작업을 하는데 큰 차이가 있습니다.
Thread는 여러 개의 Thread를 사용해 여러 개의 작업을 병렬로 처리하여 비동기적으로 작동합니다.
하지만 Coroutine은 여러 개의 작업을 잘게 쪼개 나누어 작업을 수행한다.👇🏻 아래의 그림을 보면 이해하기 쉬울 겁니다.
각자의 특징을 추가적으로 정리해 보자면 다음과 같다.👇🏻
Thread🚘
Task 단위 = Thread
-각 작업에 Thread를 할당
-각 Thread는 자체 Stack 메모리를 가지며, JVM Stack 영역 차지
Context Switching🚧
-Blocking : Thread1이 Thread2의 결과가 나올때까지 기다려야한다면 Thread1은 Blocking되어 사용하지 못함
Coroutines🚀
Task 단위 = Object(Coroutine)
-각 작업에 Object(Coroutine)을 할당
-Coroutine은 객체를 담는 JVM Heap에 적재
Context Switching => No Context Switching🙅🏻♂️
-코드를 통해 Switching 시점을 보장
-Suspend is NonBlocking : Coroutine1이 Coroutine2의 결과가 나올 때까지 기다려야 한다면 Coroutine1은 Suspend되지만, Coroutine1을 수행하던 Thread는 유효 => Coroutine2도 Coroutine1과 동일한 Thread에서 실행할 수 있음
Coroutine 예제
fun main() = runBlocking { //CoroutineScope launch { // 새 코루틴을 시작하고 계속 delay(1000L) //1초 동안 비차단 지연 println("World!") //지연 후 인쇄 } println("Hello!") // Main Coroutine은 delay 되지 않고 이어서 수행됨 }
👇🏻
Hello World!
- launch : Coroutine을 만드는 Coroutine Builder입니다. 독립적으로 계속 작동하는 나머지 코드와 동시에 새 Coroutine을 시작합니다.
- delay : 특별한 일시 중단 기능입니다. 특정 시간 동안 Coroutine을 일시 중단합니다. Coroutine을 일시 중단하면 기본 Thread가 차단되지 않지만 다른 Coroutine이 실행되고 코드에 기본 Thread를 사용할 수 있습니다.
- runBlocking : main함수 안의 Coroutine이 있는 일반 코드와 Coroutine이 아닌 코드 블록을 연결하는 Coroutine Builder입니다. 그래서 runBlocking이 중괄호로 감싸고 있는 영역을 Coroutine Scope라고 합니다. runBlocking 사용 시 이것이 속한 Thread를 해당 CoroutineScope 내의 모든 Coroutine 동작들의 실행이 완료될 때까지 블로킹하는 역할을 한다.
그래서 Thread는 고비용 리소스이고 Thread를 차단하는 것은 매우 비효율적이며 바람직하지 않기 때문에 runBlocking을 애플리케이션 최상위 수준에서는 사용되는 경우는 거의 없습니다.🙅🏻♂️
참고👀
https://developer.android.com/kotlin/coroutines?hl=ko
https://hik-coding.tistory.com/102
https://kotlinlang.org/docs/coroutines-basics.html728x90반응형'안드로이드' 카테고리의 다른 글
[Android] Android Context란? (0) 2022.02.07 [Android] SwipeRefreshLayout과 ScrollView 동시 사용시 문제 (0) 2022.01.24 [Android] Fragment LifeCycle (0) 2022.01.12 [Android] Activity Life Cycle (0) 2022.01.11 [Android] API Key값 관리 (0) 2022.01.04