Skip to content

[yeseul] 시즌 2: Week14#61

Open
HongYeseul wants to merge 1 commit into
cloud-club:mainfrom
HongYeseul:main
Open

[yeseul] 시즌 2: Week14#61
HongYeseul wants to merge 1 commit into
cloud-club:mainfrom
HongYeseul:main

Conversation

@HongYeseul

Copy link
Copy Markdown
Contributor

Week / 스터디 주차
시즌2 - 14주차

Chapter / 공부한 챕터
2장: 코루틴에 대해서

Page / 공부한 페이지
2장: 코루틴에 대해서


안녕하세요 😄
이번 주차는 자율 독서 기간이어서, 평소 회사에서 사용 중인 코루틴에 대해 공부해보았습니다.
코루틴은 이전부터 이해가 부족하다고 느껴 따로 시간을 내어 학습해보고 싶던 주제였는데, 이번 기회에 짧게나마 정리해보았습니다.

아래는 제가 정리한 내용입니다.


코루틴에 대하여

아래는 코틀린을 기준으로 작성되었습니다.

코루틴은 일반 함수와 많이 비교를 하는데, 다음과 같습니다.

항목 일반 함수 (Function) 코루틴 (Coroutine)
정의 방식 fun 키워드 사용 suspend fun 키워드 사용
중단 가능 여부 중단 불가 (한 번 실행되면 끝날 때까지 계속됨) suspend 함수 내에서 일시 중단 가능
비동기 처리 직접 Thread 또는 Executor 사용 코루틴 빌더 (launch, async 등) 사용으로 간단하게 비동기 처리
결과 반환 값을 바로 반환 일시 중단될 수 있으므로, 결과를 비동기로 반환하거나 suspend 함수 안에서 사용됨
컨텍스트 전환 직접 스레드 제어 코루틴 디스패처 (Dispatchers.IO, Dispatchers.Main)로 손쉽게 제어
예외 처리 일반 try-catch 사용 마찬가지로 try-catch 가능하며 구조적 코루틴 덕분에 관리 용이
예시 fun doWork(): String suspend fun doWork(): String

예시 비교

일반 함수

fun getData(): String {
    Thread.sleep(1000) // 실제로는 메인 스레드 블로킹
    return "데이터 반환"
}

코루틴 함수

suspend fun getData(): String {
    delay(1000) // 블로킹 없이 중단 (다른 코루틴 실행 가능)
    return "데이터 반환"
}

코루틴이 일반 함수와 다른 점은 자신이 이전에 마지막으로 실행된 위치를 알 수 있다는 점입니다.

이는 마치 운영 체제가 스레드를 스케줄링 하는 것과 동일합니다. 또한 구현 방법도 본질적으로 스레드와 차이가 없습니다.

반드시 유의할 점은 코루틴 몇 개를 생성하든 관계없이 운영체제는 이를 알지 못한다는 것입니다. 코루틴은 온전히 사용자 상태 내에서 구현된 것이기 때문에 코루틴을 사용자 상태 스레드로 해석할 수 있다.(코루틴의 스케줄링 제어권은 개발자에게 있다는 의미입니다.)

다시 말해, 함수는 특별한 연결 시작 지점이 없이 동작하는 일종의 코루틴이라고 볼 수 있습니다.


코루틴은 어떻게 구현될까?

코틀린은 일시 중지되거나 다시 시작될 수 있으며, 일시 중지될 때의 상태 정보를 반드시 기록해야 합니다. 이를 기반으로 코루틴을 다시 시작하는 것입니다.

코루틴도 함수 실행 자체는 일반 함수와 동일하게 스택에서 이뤄지며, 중단(suspend)이 발생할 경우에만 그 시점의 실행 상태(위치, 변수 등)를 힙에 저장해 두고 사용하는 구조입니다.

저장하는 실행 상태의 종류에는 다음과 같은 것들이 있습니다.

  • CPU의 레지스터 정보
  • 함수 실행 시 상태 정보

코루틴의 실행 흐름과 메모리(스택/힙) 사용 구조는 다음과 같습니다.

항목 설명
함수 실행 시작 스택에 스택 프레임 생성, 일반 함수처럼 동작
중단 지점 (suspend) 도달 현재 실행 상태(변수, 다음 위치 등)를 에 복사 (Continuation)
중단 이후 스택 프레임은 제거
재개 시점 힙에 저장해둔 상태 정보를 바탕으로 스택에 재구성 → 이어서 실행

왜 코루틴이 중요할까?

코루틴의 중요한 역할 중 하나는 바로 프로그래머가 동기 방식으로 비동기 프로그래밍을 가능하게 한다는 것입니다.

이 부분이 더 궁금하다면 컴퓨터 밑바닥의 비밀 2.8절을 따로 참고해 보세요!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant