ref: https://kotlinlang.org/docs/coroutines-basics.html#suspending-functions
이미 코루틴을 사용해봤고 약간 알고 있다고 가정하겠습니다.
다시 처음부터. suspend가 뭐라고?

그니까 멈추게 할 수 있다! 이거다. 그니까 만약
suspend fun foo(): Int {
return 0;
}
와 같은 함수가 존재한다면 컴파일 되면서 요렇게 변한다.
fun foo(continuation: Continuation<Int>): Any?
??? : 파라미터가 있으면요?
suspend fun foo(param1: Param): Int {
return 0;
}
와 같이 있었다면
fun foo(param1: Param, continuation:Continuation<Int>): Any?
처럼 변한다.
근데 도대체 이게 왜 필요한가? 이 질문부터 해보자.
Suspending functions
The most basic building block of coroutines is the suspending function. It allows a running operation to pause and resume later without affecting the structure of your code.
정확히는 stop이 아니라 pause이다. 즉 일시정지를 한다는거고 다시 시작한다는거다.
그리고 Thread에 대한 pause가 아니라 execution state에 대한 pause이다.
- suspend는 thread에 대한 block이 아님
- coroutine의 delay를 하게 되면 Thread의 sleep과는 다르게 Thread block없이 suspend/resume이 발생함
어? 그렇다면 이 상태를 어디선가 저장을 하고 있어야한다. 즉, state를 관리하는 machine이 필요하다는거다.
그니까 Thread에 대한 정지가 아니라 함수의 실행을 일시정지하고 thread는 그대로 진행됨.다시 재개했을때 동일 Thread가 아닐 수 있고 Thread의 stack frame이 유지되지 않고 Thread stack 또한 달라질 수 있음
그러면 이제 슬슬 뭔가 궁금해지는 것 중 하나로
왜 어째서 코루틴의 suspending은 concept에서 왜 thread stop으로 디자인되지 않았는가?
몇몇 자료를 좀 찾아보자.
coroutines can suspend their execution instead of blocking a thread.”
Coroutines are lightweight alternatives to threads. They can suspend without blocking system resources and are resource-friendly, making them better suited for fine-grained concurrency.
일단 스레드를 블로킹하지 않고 동시성 구현을 한다고 되어 있고 thread를 대신하기 위한 아주 가벼운 것으로 설명되고 있다. 리소스도 적게 먹고.
여기서 나온 문장들을 근거로 유추를 해보면 하드웨어 성능 상으로 thread가 돌아가기에 정말 이 thread에 상관 없는 다른 대체제를 생각하고 만들어진게 coroutine이 아닌가 싶다. 그러면 이제 state machine에서 이게 어떻게 관리되고 있는지를 봐야한다.
검색을 하던 중 이런 사이트를 보게 되었다.
https://kotlinlang.org/spec/asynchronous-programming-with-coroutines.html
여기서 좀 더 하위 칼럼 중 하나인 https://kotlinlang.org/spec/asynchronous-programming-with-coroutines.html#implementation-details 을 보면
Continuation Passing Style이라는게 나온다. 이게 뭔지를 좀 봐야겠다.
다행스럽게도 친절하게 클릭하면 설명이 나오게 되어있다.
https://kotlinlang.org/spec/asynchronous-programming-with-coroutines.html#continuation-passing-style
그니까.. 각 suspend 함수는 CPS형태로 변환된다. 그니까 Continuation을 넘긴다는 건데 정확히 Continuation에 어떤 정보가 있는지를 봐야한다.
상당히 심플하게 적혀있지만 결국 어디까지 진행했는지, 어디서 중단했는지에 대한 포인트 지점을 찍어둔거다. 아까 컴파일 된 결과에서 continuation 파라미터를 이용해 그 정보들을 계속해서 passing(전달)한다. 그래서 suspend 함수들은 원할때 pause/resume이 가능한거다.
2편에서 이어서...
velog에서 똑같은 글을 본다면 제 다른 블로그가 맞습니다.
'JAVA > Kotlin' 카테고리의 다른 글
| [kotlin deep/shallow/wide dive] deep - suspend가 정확히 뭐고 CPS는 뭐고 state machine이 뭐죠는 꼬리에 꼬리를 물고(2) (0) | 2025.12.02 |
|---|---|
| [WIP] [kotlin deep/shallow/wide dive] wide - lateinit 과 lazy (0) | 2025.11.25 |
| 판사님 저는 isXXX로 분명히 필드를 만들었다니까요? (2) | 2025.03.09 |
| 코틀린 클래스에서 기본 생성자가 있는 클래스의 상속 (1) | 2023.10.22 |
| Kotlin의 TODO (0) | 2023.10.05 |

