코루틴(Coroutine)이란?
코루틴의 영어 그대로 뜻을 살펴보면 코루틴은 Co(함께, 서로) + routine(규칙적 일의 순서, 작업의 집합) 2개가 합쳐진 단어로 함께 동작하며 규칙이 있는 일의 순서를 뜻합니다.
코루틴의 이름 때문에 코틀린과 연관있다고 생각하실 수도 있지만 코루틴은 1958년 코루틴 용어가 만들어지고 난 후 어셈블리 프로그램에서부터 적용되었던 개념입니다.
C#, Javascript, Python, Go와 같은 고급 프로그래밍 언어에서도 지원하고 있으며 Javascript의 async/await 기술을 사용하고 있다면 더욱 친숙하게 코틀린을 느끼실 수도 있습니다.
하지만 이번에는 코틀린을 중심으로 보겠다.
비선점형 : 하나의 프로세스가 CPU를 할당받으면 종료되기 전까지 다른 프로세스가 CPU를 강제로 차지할 수 없습니다. (코루틴)
선점형 : 하나의 프로세스가 다른 프로세스 대신에 프로세서(CPU)를 강제로 차지할 수 있습니다. (쓰레드)
결국 코루틴은 실행이 마지막으로 중단되었던 지점의 바로 다음장소에서 실행을 재개한다고 볼 수 있습니다.

코루틴의 특징은 이 일직선적인 흐름을 중간에 지연시켰다가(suspend) 다시 재시작(resume)이 가능하다.
또 코루틴은 자기 스스로가 메인루틴이 되면서도 서브루틴이 될 수 있다는 특징도 있다.
코루틴 코드
fun main() = runBlocking { // this: CoroutineScope
launch { // launch a new coroutine and continue
delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
println("World!") // print after delay
}
println("Hello") // main coroutine continues while a previous one is delayed
}
launch 는 코루틴 빌더로 나머지 코드와 동시 실행을 위해 새로운 코루틴을 생성하며 작업을 독립적으로 진행한다.
떄문에 Hello가 먼저 출력되었다.
delay 는 특별한 일시 정지 기능으로, 특정 시간동안 코루틴을 일시정지 시킨다.
코루틴을 일시 중단하면 기본 스레드가 차단되지 않지만, 다른 코루틴이 코드를 위해 기본 스레드를 실행하고 사용할 수 있다.
runBlocking 도 코루틴 빌더로 fun main()의 코루틴이 아닌 영역과 runBlocking 중괄호 내의 코루틴 코드를 연결한다.
IDE는 this: CoroutineScope라는 힌트로 하이라이트 표시된다.
애플리케이션의 최상위 레벨에서 이와 같이 사용되는 runBlocking을 종종 볼 수 있고, 실제 코드 내부에서는 거의 볼 수 없다.
스레드는 고가의 리소스이고 스레드를 차단하는 것이 비효율적이며, 종종 바람직하지 않기 때문이다.
[kotlin] 코틀린의 코루틴 가이드(1)
Kotlin, 코루틴 제대로 이해하기 - (1)
코루틴(Coroutine)에 대하여