Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions week14/README.md
Original file line number Diff line number Diff line change
@@ -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절을 따로 참고해 보세요!