Kotlin Coroutines 이란 무엇인가요?
Coroutines 이란 무엇인가?
Kotlin coroutines은 비동적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계된 패턴이다. 코루틴은 Kotlin 1.3 버전에 추가되었습니다.
코루틴의 장점
- 경량화
- 코루틴은 실행 중인 스레드를 차단하지 않은 “정지”를 지원하므로 단일 스레드에서 많은 코루틴을 실행할 수 있다.(정지 하는것은 동시 작업을 지원하므로 차단보다 메모리를 절약합니다.)
- 기본으로 제공되는 취소 지원
- 실행 중인 코루틴 계층 구조를 통해 자동으로 취소가 전달됩니다.
- Jetpack통합
- 많은 Jetpack라이브러리에 코루틴을 완전히 지원하는 확장 프로그램이 포함되어있습니다.
Coroutines와 Thread
Process와 Thread
프로세스(Process)는 메모리 영역은 코드(code), 데이터(data), 스택(stack), 힙(heap) 영역으로 구성된다.
스레드(Thread)는 프로세스(Process) 내에서 실제로 작업을 수행하는 주체를 의미하며 그 영역안에 스레드 는 자체 프로그램 카운터, 레지스터 세트, 스택을 가지고 있지만 자신이 속한 프로세스의 코드, 데이터 및 파일을 공유하는 기본 실행 단위입니다.
Coroutunes
코루틴(Coroutunes)은 하나의 작업(Job)이라 말하고 이 Job 이 서로 협력하여 멀티태스킹을 수행하는 행위를 코루틴(Coroutunes)이라 합니다. 코루틴(Coroutunes)은 스레드(Thread)내에서 작동하는 더 작은 단위 스레드로 생각하면 됩니다.
💡 코루틴(Coroutunes)은 작업 하나 하나를 Object 단위로 할당합니다. Kotlin 기준으로 Coroutine Object도 엄연히 객체이기 때문에 JVM Heap에 적재됩니다. |
하나의 스레드(Thread)가 다수의 코루틴(Coroutunes)를 수행할 수 있기 때문에 그 이상의 작업수 만큼 스레드(Thread)를 양산하며 메모리를 소비를 줄일 수 있습니다.
코루틴(Coroutunes)은 각 스레드마다 갖는 Stack메모리 영역을 갖지 않기 때문에 스레드 사용시 스레드 개수 만큼 Stack 메모리에 따른 사용공간이 증가하지 않아도 된다. 또한 같은 프로세스 내에서 Heap에 대해 Locking 걱정도 없다.
CoroutineScope
Coroutine은 새로운 코루틴을 생성하고 실행되어야할 작업(Job) 범위를 지정하고, 제어할 수 있는 범위를 지정해주는 역할을 한다.
- CoroutineScope
- 기본적인 CoroutineScope입니다. 코루틴이 필요할 떄만 새로 선언해주고 완료되거나 필요없어지면 종료되는 Scope입니다.
- GlobalScope
- 앱이 실행될때 부터 앱이 종료될 때까지 코루틴을 실행시킬 수 있는 Scope입니다. 앱의 생명주기와 함께 동작하기 때문에 실행 도중에 별도 생명 주기 관리가 필요없다.
- Android 개발에서는 LifeCycle와 관련이 있어 사용에 앞서 조심해야한다.
- ViewModelScope
- Jetpack 아키텍처의 ViewModel컴포넌트 사용시 ViewModel에서 사용하기 위한 Scope입니다.
- ViewModelScope는 ViewModel이 onClear시 Corutine도 모두 취소 처리할 수 있게 도와줍니다.
Coroutine Context 와 Dispatcher
코루틴은 항상 Kotlin 표준 라이브러리에 정의된 Coroutine Context 타입의 값으로 정의된 Context에서 실행된다.
Dispatcher는 CoroutineContext의 주요 요소중 하나이며, Coroutine Context에 상속받아 어떤 스레드를 사용할지 미리 정의합니다. 코루틴 실행을 특정 스레드로 제한하거나 스레드 풀에 보내거나 제한을 받지 않는 상태로 실행할 수 있다.
launch와 async 같은 모든 코루틴 Builder는 새로운 코루틴 및 기타 context에 대한 dispatcher를 명시적으로 지정하는데 사용할 수 있는 옵션인 파라미터를 사용할 수 있습니다.
Dispatchers.Default
- 크기가 큰 리스트를 처리하거나 무거운 연산을 할때 사용합니다.
Dispatchers.IO
- 네트워크 및 파일 읽고 쓰는 작업에 최적화 되어있습니다. 네트워킹, 내부 DB, 파일 읽을때 사용합니다.
Dispatchers.Main
- 안드로이드에서 UI 쓰레드를 사용합니다.
Coroutine Builder
Coroutine Builder는 CoroutineScope의 확장 함수로 사용하는 여러 가지 함수를 포함하고 있습니다.
launch()
- launch()는 동시성 작업이 결과를 만들어내지 않은 경우에 적합하다. 또한 결과를 반환하지 않고 launch()수행시 job을 반환한다.
async()
- launch()와 다르게 동시성 작업 결과가 필요한 경우 async() 빌더를 사용한다.
- async 빌더 원형으로 DeferredCoroutine 인스턴스를 반환하고 있다. 인스턴스는 job의 하위 타입으로 await() 메소드를 통해 계산 결과를 접근 할 수 있다.
runBlocking()
launch()
,async()
빌더는 일시 중단 함수 내부에서 스레드 호출을 블럭시키지 않고 백그라운드 스레드를 공유하는 풀을 통해 작업을 실행한다. 반대로runBlocking()
은 Default로 현재 스레드에서 실행되는 작업을 생성하고 해당 작업이 완료될 떄 까지 현재 스레드의 실행을 블록시킨다.runBlocking()
을 메인 스레드에서 실행하면 메인스레드가 Block이 되고runBlocking()
작업을 수행하기 때문에 다른 코루틴 작업에서 수행해서는 안된다.
withContext
async()
,await()
을 이용하면서 Deferred 값으로 결과를 감싸여 처리했지만withContext()
를 이용하면 이 작업을 줄일 수 있습니다.
Coroutine suspend
코루틴(Coroutine)은 일반적인 메소드는 호출할 수 없습니다. 코드를 잠시 실행을 멈추(suspend)거나 다시 실행(resume)될 수 있기 때문이다. 코루틴(Coroutine)의 Context 를 사용해 메소드를 실행하려면 suspend 를 붙여주어야 한다. suspend를 붙인 메소드는 Coroutine Scope 안에서 실행이 가능하다.
개인적으로 공부하며 정리한글입니다. 부족한 부분과 오타 및 잘못된 부분은 댓글로 지적 부탁드립니다. 감사합니다.
참고
- https://thdev.tech/kotlin/2019/04/05/Init-Coroutines/
- https://developer.android.com/kotlin/coroutines?hl=ko
- https://eunoia3jy.tistory.com/132
- https://medium.com/hongbeomi-dev/코틀린의-코루틴-4-coroutine-context-and-dispatchers-1eab8f175428
- https://blog.yena.io/studynote/2020/04/26/Android-Kotlin-Coroutine.html
- https://thdev.tech/kotlin/2020/12/22/kotlin_effective_16/
- https://developer88.tistory.com/entry/ViewModel에서-Coroutine을-이용하는-방법-ViewModel-Scope
- https://kotlinlang.org/docs/coroutine-context-and-dispatchers.html#debugging-coroutines-and-threads
- https://aaronryu.github.io/2019/05/27/coroutine-and-thread/
- https://kotlinlang.org/docs/composing-suspending-functions.html#lazily-started-async
댓글
이 글 공유하기
다른 글
-
Firebase crashlytics으로 앱 안정성 확보하기
Firebase crashlytics으로 앱 안정성 확보하기
2024.06.26 -
직접 클라우드 서버 제작 및 서버 인프라 설계
직접 클라우드 서버 제작 및 서버 인프라 설계
2023.12.18 -
WebRTC란?
WebRTC란?
2023.04.10 -
학교에서 배운 html로 반응형 웹페이지 만들어보기
학교에서 배운 html로 반응형 웹페이지 만들어보기
2019.12.19