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