지금까지 코루틴을 공부하면서 보면 이 녀석은
특정 시점에 내 맘대로 멈추고 다시 실행시키는데 이런 동작은 참 신기하다.
그래서 이번 글에서는 코틀린 컴파일러가 내부적으로 어떻게 동작하는지 살펴보겠다.
코틀린 컴파일 과정
사실 이렇게 제목을 달아야할까 싶을 정도로 간단히 적을 내용이다.
자바를 알고 있는 개발자라면 자바가 어떻게 컴파일되는지 알고 있을텐데 코틀린도 유사하다.
.kt 확장자를 가진 파일을 코틀린 컴파일러가 .class 확장자인 바이트코드로 변환한다.
이게 끝이다.
바이트코드를 Decompile하면?
대체 뭐가 나올까?
.java 파일로 decompile된 코드가 보인다.
Android Studio에서 해당 과정을 진행할 수 있는데
Tools - Kotlin - Show Kotlin Bytecode
메뉴를 통해 바이트코드가 보이면 Decompile 버튼이 있다.
두 코드를 비교해보자
먼저 우리가 이전 글에서 썼던 함수를 가져왔다.
suspend fun coroutine(number: Int, delay: Long) {
println("Coroutine $number starts work")
delay(delay)
println("Coroutine $number has finished")
}
이 녀석을 decompile하고 나면 대략 아래와 같은 코드를 볼 수 있다.
fun coroutine(number: Int?, delay: Long?, continuation: Continuation<Any?>) {
when (continuation.label) {
0 -> {
println("Coroutine $number starts work")
delay(delay)
}
1 -> {
println("Coroutine $number has finished")
continuation.resume(Unit)
}
}
}
이제 두 코드를 비교해보면 먼저 decompile된 녀석은 suspend modifier가 없다.
그리고 Continuation이라는 파라미터가 추가됐다.
함수 본문은 when으로 변경되었고 continuation 객체의 label 프로퍼티 값에 따라 코드를 실행한다.
여기서 우리가 볼 수 있는 부분은 suspend 함수는 부분적으로만 실행된다는 것이다.
Continuation 파라미터는 continuation, resume을 호출해 완료되면 호출자에게 알리기 때문에 콜백처럼 동작한다.
반면에 Continuation 파라미터는 실행 여부를 결정하는 상태 값의 역할도 한다.
'Language > Kotlin' 카테고리의 다른 글
Coroutines의 Main safety (0) | 2024.05.07 |
---|---|
Coroutine Builder 이해하기 (0) | 2024.05.02 |
Coroutines을 다른 스레드에서 실행하기 (0) | 2024.03.03 |
Blocking vs Suspending 차이점 (0) | 2024.03.01 |
Thread와 Coroutines 비교 (0) | 2024.02.22 |