코틀린을 통해 코루틴을 처음 접하기 때문에 코루틴이 코틀린 언어에 종속적인 기술이라고 생각하는 사람들이 많다. 그러나 코루틴은 1958년 코루틴 용어가 만들어지고 난 후 어셈블리 프로그램에서부터 적용되었던 개념이다.
C#, Javascript, Python, Go와 같은 고급 프로그래밍에서도 지원하고 있으며 Javascript의 async/await 기술을 사용하고 있다면 친숙하게 코틀린을 느낄 수 있다.
코루틴은 Co(함께, 서로) + routine(규칙적 일의 순서, 작업의 집합) 2개가 합쳐진 단어로 함께 동작하며 규칙이 있는 일의 순서를 뜻한다.
코루틴의 정의
실행의 지연과 재개를 허용함으로써, 비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 컴퓨터 프로그램 구성 요소
따라서 코루틴은 병행성은 제공하지만, 병렬성은 제공하지 않는다.
병행성(= 동시성): 논리적으로 병렬로 작업이 실행되는 것처럼 보이는 것
병렬성: 물리적으로 병렬로 작업이 실행되는 것
선점형으로 비동기 처리 시에는 몇 가지 문제점이 있다.
이러한 문제를 해결하기 위해 다양한 방법이 나오는데, 코루틴은 이런 단점을 해결해 주는 언어적 지원 방법이며 비선점적 멀티 태스킹을 사용하여 해결하고 있다.
코루틴은 쓰레드가 아닌 쓰레드 내 동작하는 하나의 작업 단위이며 정의된 다양한 구성요소의 집합인 Context를 오버라이드 하며 실행된다. 따라서 쓰레드 내 Context Switching 없이 여러 코루틴을 실행 중단, 재개하는 상호작용을 통해 병행성을 갖기에 쓰레드와 메모리 사용이 줄어들고 개발자가 직접 작업을 스케줄링 할 수 있도록 한다.
프로그램은 여러 루틴의 조합으로 진행되는데, 메인 루틴과 서브 루틴으로 나뉜다.
서브 루틴은 메모리에 기능을 모아 놓고, 호출 시 저장된 메모리로 이동한 뒤 실행 후 반환문을 통해 원래 호출 위치로 돌아온다.

코루틴은 서브 루틴과 비슷하지만 큰 차이점이 있다.

서브 루틴은 단일 진입 지점에서 시작 후 단일 반환 지점에서 종료되는 것에 반해, 코루틴은 진입 후 반환문이 없더라도 임의 지점에서 실행 중 동작을 중단하고 이후 해당 지점에서부터 실행을 재개한다. (진입과 반환이 여러개이다.)
이는 내부적으로 Continuation Passing Style(CPS, 연속 전달 방식)과 State machine을 이용하여 동작한다.
코루틴에서 함수 호출 시 연산 결과 및 다음 수행 작업과 같은 제어 정보를 가진 일종의 콜백 함수인 Continuation을 전달하며 각 함수의 작업이 완료되면 Continuation을 호출한다. 이를 통해 상태를 연속적으로 전달하며 컨텍스트를 유지하고 코루틴 실행 관리를 위한 State machine에 따라 코드 블록을 구분해 실행한다.
코틀린 언어를 개발한 Jetbrain에서는 멀티 스레딩 문제를 간소화된 비동기 작업 방식으로 해결할 수 있도록 코틀린을 개발했다.
코루틴은 메인 쓰레드가 Blocking 되는 부분에 도움을 주며, 비동기 처리 코드를 순차적인 코드로 만들 수 있게 한다.
예로 메인 쓰레드에서 화면 UI를 그리는데 네트워크 작업까지 처리하면 블로킹되어 응답성 높은 UI 작업이 어려워진다. 이러한 경우에 네트워크 작업을 비동기로 처리하기 위해 주로 사용된다.
물론 ReactiveX Java 를 사용해서도 비동기를 해결할 수 있으며 Coroutine,에 비해 제공하고 있는 함수도 많다.
그럼에도 RxJava는 러닝 커브가 상당하기에 코루틴을 많이 사용함
코루틴을 사용하면 비동기로 루틴을 실행하고 일반적인 서브 루틴과 다르게 실행 중간에 중단과 임의 시점에 재개가 가능하여 루틴 간 협렵을 통해 비선점적 멀티태스킹이 가능해진다.
동시성 프로그래밍이란 2개 이상의 프로세스가 동시에 계산을 진행하는 상태를 말한다.
두 개 이상의 실행 쓰레드가 필요하나 단일 코어에서는 병렬적으로 실행하는 것이 물리적으로 불가하기에 쓰레드 실행이 비효율적이도록 교차 배치한다.
동시성 프로그래밍을 쓰레드와 코루틴 간 비교해보면 다음과 같다.

쓰레드는 OS가 CPU 상태에 따라 쓰레드 작업을 스케줄링 하기에 쓰레드 간 교체 시 Context Switching 비용이 발생한다.
코루틴은 하나의 쓰레드 내 코루틴 간 관계 정의를 통해 중단 및 재개하기에 Context switching 비용으로 인한 오버헤드 없이 언어 레벨에서 스케줄링이 가능하게 한다.
따라서 코루틴에서 메인 쓰레드를 차단하지 않으면서 현재 코루틴 실행을 일시 중지할 수 있는 기능을 제공하기에 경량 쓰레드로도 불린다.
비동기 코드 작성 시 정상적인 비동기 결과를 받아서 처리하는 코드 외에 비정상적으로 완료되지 못하는 케이스를 예외 처리할 수 있는 부수적인 액세서리 코드 작성이 필요하다.
코루틴은 예측 가능한 프로그래밍을 할 수 있다는 점에서 동기 코드 진행 흐름과 동일하게 예외 처리가 가능하며 디버깅 측면에서도 큰 장점이 있다.
또한 멀티 쓰레드와 비교해서 서로에게 영향 주기 위해 쓰레드 간 통신과 콜백 구조로 코드가 흐르지 않기에 코드 흐름 파악이 쉽다.
OS가 CPU 상태에 따라 쓰레드 작업을 스케줄링 하지 않고 개발자가 직접 작업을 스케줄링 하기에 비동기 코드 작성이 간단하다.