From 08b8386c01f3388a06941c57a3ab17d0a15ec4f8 Mon Sep 17 00:00:00 2001 From: HongYeseul Date: Wed, 18 Jun 2025 18:02:16 +0900 Subject: [PATCH] =?UTF-8?q?[yeseul]=20=EC=8B=9C=EC=A6=8C=202:=20Week14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- week14/README.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 week14/README.md diff --git a/week14/README.md b/week14/README.md new file mode 100644 index 0000000..9c31316 --- /dev/null +++ b/week14/README.md @@ -0,0 +1,78 @@ +## 코루틴에 대하여 + +아래는 코틀린을 기준으로 작성되었습니다. + +코루틴은 일반 함수와 많이 비교를 하는데, 다음과 같습니다. + +| 항목 | 일반 함수 (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` | + +--- + +### 예시 비교 + +**일반 함수** + +```kotlin +fun getData(): String { + Thread.sleep(1000) // 실제로는 메인 스레드 블로킹 + return "데이터 반환" +} +``` + +**코루틴 함수** + +```kotlin +suspend fun getData(): String { + delay(1000) // 블로킹 없이 중단 (다른 코루틴 실행 가능) + return "데이터 반환" +} +``` + +--- + +코루틴이 일반 함수와 다른 점은 자신이 이전에 마지막으로 실행된 위치를 알 수 있다는 점입니다. + +이는 마치 운영 체제가 스레드를 스케줄링 하는 것과 동일합니다. 또한 구현 방법도 본질적으로 스레드와 차이가 없습니다. + +반드시 유의할 점은 코루틴 몇 개를 생성하든 관계없이 운영체제는 이를 알지 못한다는 것입니다. 코루틴은 온전히 사용자 상태 내에서 구현된 것이기 때문에 코루틴을 사용자 상태 스레드로 해석할 수 있다.(코루틴의 스케줄링 제어권은 개발자에게 있다는 의미입니다.) + +다시 말해, 함수는 특별한 연결 시작 지점이 없이 동작하는 일종의 코루틴이라고 볼 수 있습니다. + +--- + +### 코루틴은 어떻게 구현될까? + +코틀린은 일시 중지되거나 다시 시작될 수 있으며, 일시 중지될 때의 상태 정보를 반드시 기록해야 합니다. 이를 기반으로 코루틴을 다시 시작하는 것입니다. + +코루틴도 함수 실행 자체는 일반 함수와 동일하게 스택에서 이뤄지며, 중단(suspend)이 발생할 경우에만 그 시점의 실행 상태(위치, 변수 등)를 힙에 저장해 두고 사용하는 구조입니다. + +저장하는 실행 상태의 종류에는 다음과 같은 것들이 있습니다. + +- CPU의 레지스터 정보 +- 함수 실행 시 상태 정보 + +코루틴의 실행 흐름과 메모리(스택/힙) 사용 구조는 다음과 같습니다. + +| 항목 | 설명 | +| ------------------------ | ------------------------------------------------- | +| **함수 실행 시작** | 스택에 스택 프레임 생성, 일반 함수처럼 동작 | +| **중단 지점 (`suspend`) 도달** | 현재 실행 상태(변수, 다음 위치 등)를 **힙**에 복사 (`Continuation`) | +| **중단 이후** | 스택 프레임은 **제거**됨 | +| **재개 시점** | 힙에 저장해둔 상태 정보를 바탕으로 스택에 재구성 → 이어서 실행 | + + +--- + +## 왜 코루틴이 중요할까? + +코루틴의 중요한 역할 중 하나는 바로 프로그래머가 동기 방식으로 비동기 프로그래밍을 가능하게 한다는 것입니다. + +이 부분은 컴퓨터 밑바닥의 비밀 2.8절을 따로 참고해 보세요! \ No newline at end of file