오늘의 공부는 코틀린의 코루틴 동작원리입니다.
원본 영상은 아래 링크를 참조해주세요.
코틀린의 코루틴들은 사실 컴파일러에서 Finite State Machine 기반의 재귀 함수로 변환된다.
비동기 코드들이 일반적으로 중첩 for 문의 callback 코드 조각들처럼 구성되어 있는데 코틀린에서는 다르다.
코틀린 컴파일러는 코드 조각들을 순차적으로 작성해도 컴파일 타임 시에 코드 조각들을 찢어 state 와 재귀 함수로 변환해준다. 상태와 결과 체크를 컴파일러에서 다 해주기 때문에 callback 지옥에서 벗어나 프로그래머가 순차적으로 작성할 수 있게 도와준다.
이러한 과정을 "코틀린 컴파일러가 suspend 가 붙은 함수에 대해 Continuation Passing Style(CPS) 로 바꾼다" 라고 표현한다.
위와 같은 예제의 코드를 비동기적으로 처리한다고 가정하자.
코틀린에서 자바로 변환될 때 두 번째 줄부터 Continuation 객체가 주입(Dependency Injection) 이 된 것을 볼 수 있다.
이 Continuation 인터페이스는 현재 상태의 context 와 resume 메서드를 가지고 있다.
콜백 지옥에서도 자세히 보면 callback 함수들을 전달하는 것을 볼 수 있는데 코틀린에서는 이 callback 함수들을 인터페이스화하여 추상화하고 인자로 주입한 것이다.
먼저 라인 별로 Label 을 지정해 자르고,
앞에서 소개한 Continuation 객체를 인자로 주입하고, 코루틴 구현체를 만들어 Continuation 객체를 체크해서 재귀함수를 호출할지 결정한다.
각 case 에 따라 다음 case 에 필요한 인자를 셋팅하고 순차적으로 호출하는 것을 볼 수 있다.
코틀린 개발자들은 겸손해서 그런지 Magic 이 아니라고 하는데
나는 다중 for 문(?)의 구조를 상태 DI(Dependency Injection) 와 Finite State Machine 으로 구현한 것이 인상적이었다
'언어 > Kotlin' 카테고리의 다른 글
[코프링] 코틀린과 스프링 (1) (0) | 2022.04.16 |
---|---|
[Kotlin] 코틀린 특징 (0) | 2022.04.16 |