×
뎁스노트
로그인
홈
언어
프레임워크
개발도구
네크워크와 서버
데이터베이스
프로젝트 관리
데이터 사이언스
이야기
모집 · 홍보
글쓰기
블로그 쓰기
개발 노트, 이야기를 작성해보세요.
질문하기
부담없이 무엇이든 질문하세요.
로그인
회원가입
Kotlin
코틀린 코루틴 실제 구현 코드에서 상태를 가지고 있어야 하는 경우에 질문이 있습니다.
couroutine
코루틴
코틀린
햄깅
3개월 전
팔로우
팔로잉
안녕하세요 '코틀린 코루틴' 책을 읽으면서 공부 중인데 *코루틴 내부 실제 구현 코드*를 보다가 궁금한 점이 생겨 질문드립니다. ```Kotlin suspend fun myFunction() { println("Before") var counter = 0 delay(1000) // 중단 함수 counter++ println("Counter: $counter") println("After") } ``` - 위와 같이 상태(`counter`) 를 보존해야하는 함수인 경우에 실제 구현이 아래처럼 된다고 나와있습니다. ```Kotlin fun myFunction(continuation: Continuation
): 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` 으로 선언하고 시작해도 원하는대로 실행이 되지 않을까.. 라고 생각됩니다.
0
0
2
86
신고하기
사용자 차단하기
햄깅
3개월 전
팔로우
팔로잉
댓글
2
올리기
답변 작성
답변 모드로 쓰기
이미지 첨부
올리기
무린
코루틴은
비동기 작업의 효율적 처리 등을 위해
일반 함수와는 다르게
실행 상태를 일시 중단했다가 재개
할 수 있습니다. 이를 위해 이 함수의 상태(변수 값, 실행 위치 등)를 저장하고 관리해야 하며, 이를 위해
Continuation
객체가 사용됩니다.
질문에 나온 코드에서
var counter = continuation.counter
로 초기화하는 이유는,
코루틴이 중단되었다가 재개될 때 이전 상태를 복구하기 위해서입니다.
반대로 var counter = 0으로 매번 초기화하면 코루틴이 재개될 때 이전 상태가 손실되어 원하는 동작을 하지 못하게 됩니다.
또 궁금하신 사항 있으시면 언제든지 질문 주세요~^^
3개월 전
∙
1
∙
답글 달기
∙
공유
∙
신고
∙
차단
햄깅
@무린
이해가 되었습니다 친절한 답변 감사합니다!
3개월 전
∙
1
∙
답글 달기
∙
공유
∙
신고
∙
차단
1
0
0
2
신고하기
사용자 차단하기