Android의 코루틴은 비 동기적으로 실행되는 코드를 비교적 효율적으로 구현할 수 있게 해주는 동시 실행 설계 패턴이다.
1. 코루틴에서의 주요 기능은 다음과 같다.
Thread 대비 굉장히 가볍다.
기존의 비동기 작업은 Context Switching을 하면 기존 Thread는 차단시키는 것에 반해 코루틴은 실행 중인 Thread를 차단하지 않고 일시 정지할 수 있다. 따라서 Single-Thread에서 많은 코루틴을 실행할 수 있다. 이때, 기존의 Thread를 일시 정지하는 것은 동시에 많은 작업을 할 수 있게 하면서도 차단하는 것보다 메모리를 절약한다.
작업을 간편하게 취소할 수 있다.
코루틴에서는 ".cancle()"을 이용하여 Thread보다 쉽게 취소할 수 있다.
작업 용도에 따라 어떤 Thread에서 동작할지 설정할 수 있다.
코루틴에서는 Dispatcher를 통해서 어디서 동작할지 지정할 수 있다.
1. Main (기본 Thread) - UI 관련 작업.
2. IO (외부 Thread) - 네트워크나 파일 작업 등의 I/O 작업. I와 O는 각각 Input과 Output을 의미한다.
3. Default (외부 Thread) - 연산이 많은 작업.
2. 코루틴의 동작 과정
우리가 동기 작업에서 사용하던 함수는 메인 루틴에서 함수를 호출하면 메인 루틴은 함수가 완전히 종료될 때까지 대기 상태에 있다가 함수가 종료되면 다시 메인 루틴이 실행되는 방식이다. 여기서 함수가 실행되는 루틴은 함수가 종료되면 그 루틴의 내용은 다 사라진다. 즉, 함수가 돌아가는 서브루틴은 메인 루틴에 종속된 관계라고 할 수 있다.
하지만 코루틴은 동기작업과는 다르게 비동기 작업에서의 코드 효율을 높여주기 위한 패턴이므로 동기작업에서와는 다르게 메인 루틴과 서브 루틴(코루틴)이 대등한 관계이다. 참고로 코루틴(Coroutine)은 Cooperative Routine의 약자로 서로 협력하는 루틴이라는 의미이다.
코루틴의 동작 과정은 위와 같다.
코루틴은 함수가 종료되지 않은 상태에서 메인 루틴의 코드를 실행한 뒤 다시 돌아와서 코루틴의 코드를 실행한다. 따라서 코루틴이 종료된 것이 아니게 되고 코루틴의 내용도 계속 유지된다.
추가로 일반 함수를 호출하면 코드를 한 번만 실행할 수 있지만, 코루틴에서는 여러 번 실행할 수 있다. 즉, 함수의 코드가 실행되는 시점이 진입점(Entry Point)라고 하는데 코루틴은 이러한 진입점이 여러 개인 함수인 것이다.
예를 들어 Thread 위에서 코루틴1, 2, 3이 있다고 가정해보자. 코루틴1을 실행하던 중 코루틴2가 실행되어도 실행중인 Thread를 정지하면서 Context Switching 느낌으로 다른 Thread로 전환하는 것이 아니라 기존의 실행중이던 Thread를 유지하면서 기존 Thread에서 코루틴2를 실행하는 것이다. 이후 코루틴1을 다시 실행할 때, 저장해둔 코루틴1 상태를 불러와서 다시 기존 Thread에서 코루틴1을 실행한다.