햄깅

햄깅

햄깅햄깅· 2개월

질문코틀린 코루틴 실제 구현 코드에서 상태를 가지고 있어야 하는 경우에 질문이 있습니다.

안녕하세요 '코틀린 코루틴' 책을 읽으면서 공부 중인데 코루틴 내부 실제 구현 코드를 보다가 궁금한 점이 생겨 질문드립니다. suspend fun myFunction() { println("Before") var counter = 0 delay(1000) // 중단 함수 counter++ println("Counter: $counter") println("After") } 위와 같이 상태(counter) 를 보존해야하는 함수인 경우에 실제 구현이 아래처럼 된다고 나와있습니다. fun myFunction(continuation: Continuation<Unit>): Any { val continuation = continuation as? MyFunctionContinuation ?: MyFunctionContinuation(continuation) var counter = continuation.counter if (continuation.label == 0){ println("Before") counter = 0 continuation.counter = counter continuation.label = 1 if (delay(1000, continuation) == COROUTINE_SUSPENDED){ return COROUTINE_SUSPENDED } } if (continuation.label == 1){ counter = (counter as Int) + 1 println("Counter: $counter") println("After") return Unit } error("Impossible") } 여기서 궁금한 점은counter를 초기화할 때 0으로 초기화하지 않고 continuation.counter 로 초기화하는 이유가 있는지 입니다. 머릿 속으로 그려보면 var counter = 0 으로 선언하고 시작해도 원하는대로 실행이 되지 않을까.. 라고 생각됩니다.
74
2
0
무린
무린·2025-01-20
코루틴은 비동기 작업의 효율적 처리 등을 위해 일반 함수와는 다르게 실행 상태를 일시 중단했다가 재개할 수 있습니다. 이를 위해 이 함수의 상태(변수 값, 실행 위치 등)를 저장하고 관리해야 하며, 이를 위해 Continuation 객체가 사용됩니다.질문에 나온 코드에서 var counter = continuation.counter로 초기화하는 이유는,&n...