본문 바로가기
개발관련

코루틴(coroutine)이란?

by MinChan-Youn 2021. 11. 18.

코틀린(Kotlin)의 코루틴(coroutine)이란? 코루틴의 coroutine에서 co(함께, 동시에)라는 의미를 가지고 있습니다. 즉 동시성 프로그래밍 개념을 Kotlin에 도입한것인 Coroutine이라고 합니다.

 

비동기적으로 실행이 되며, 기존 다중 스레드보다 더 효율적으로 동작

 

*코루틴 스코프 종류

-CoroutineScope: 사용자 지정(ex. 버튼을 눌러 다운로드 하거나 서버에서 이미지 열기 등, 필요할 때만 사용 및 종료할때 CoroutineScope사용)

-GlobalScope: 앱의 생명주기와 함께 동작하기 때문에 실행도중 별도 생명주기 관리가 필요없음(실행~종료까지 긴기간 실행되는 스코프)

-ViewModelScope: Jetpack 아키텍처의 뷰모델 컴포넌트 사용시 ViewModel 인스턴스에서 사용하기 위해 제공되는 스코프, 해당 스코프는 실행되는 코루틴은 ViewModel 인스턴스가 소멸될 때 자동으로 취소

 

 

*코루틴의 디스패쳐

-Dispatchers.Main: 안드로이드의 메인 쓰레드 (UI구성 LiveData 업데이트 사용)

-Dispatchers.IO: 네트워크, 디스크, DB작업 I/O실행에 최적화(Retrofit으로 네트워크 통신, File이나 Room 데이터베이스에서 데이터를 읽고/쓰기 사용)

-Dispatchers.Default: 안드로이드 기본 스레드풀 사용. CPU를 많이 쓰는 작업에 최적화(데이터 정렬, 복잡한 연산 등)

-Dispatchers.Unconfined: 호출한 컨텍스트를 기본으로 사용하는데 중단 후 다시 실행될 때 컨텍스트가 바뀌면 바뀐 컨텍스트를 따라가는 특이한 디스패처

 

 

-suspend: Coroutine의 가장 큰 특징인 suspend는 Coroutine안에서 사용되면 suspend 함수가 호출 될 경우 이전까지으 코드실행이 멈추고 suspend함수 처리완료후 멈춰있던 원래 Scope의 다음 코드실행!(즉 Coroutine실행되다가 중간에 suspend를 만나면 suspend함수를 모두 끝내고 그 다음으로 넘어간다는 뜻)

 

*코루틴 사용방법

1. 어떤 쓰레드에서 실행할 건가를 정한는 Dispatchers 정하고 (Dispatchers.Main, Dispatchers.IO, Dispatchers.Default)

2. 코루틴이 실행될 Scope 정하고 (CoroutineScope, ViewModelScope, LifecycleScope, liveData...)

3. launch 또는 async 코루틴을 실행 시키면 됩니다!'

 

 

 

 

 

그렇다면 이렇게도 생각해 볼 수 있을 것이다.

그럼 스레드(Thread)와 코루틴(Coroutine)의 차이는 뭐야? 라고 생각할 수 있다.

둘의 공통점은 프로그램을 만드는 과정에서 '비동기'처리를 사용한다는 점

 

스레드(Thread)는 여러개의 스레드를 사용하여 '병렬'로 수행하여 비동기적으로 작동

코루틴(Coroutine)은 비동기 작업이지만 실제로 병렬적으로 수행은 아니고 여러개의 작업을 잘게 쪼개서 나누어 작업을 수행하기 때문에 동시에 처리되는 것처럼 보이게 함

 

코루틴은 실제로 병렬 처리를 하는것은 아니지만 스레드보다 가볍기때문에 성능면에서 뛰어나고 코드를 간결하게 사용하기 편한 장점이 있음

 

 

 

 

 

 

 

 

용어정리

1. 비동기: 어떤 작업을 수행할 때, 작업이 끝나기를 기다리지않고 다음 작업을 수행

2. 동기: 어떤 작업을 수행할 때, 작업이 끝나기를 기다린 뒤 다음 작업 수행