
Coroutine이란?
Coroutine은 경량화된 비동기 프로그래밍의 실행 단위로, Thread와 비교하여 더 효율적이고 유연한 동시성 처리 방법을 제공한다. Thread는 운영체제에서 관리되며, 무겁고 문맥 교환(Context Switching) 시 비용이 크다. 반면, Coroutine은 사용자 수준에서 실행되며, 스레드와는 독립적으로 동작하여 보다 가벼운 동시성 처리가 가능하다.
Coroutine과 Thread 비교
1. 비동기(Asynchronous)
- Thread는 작업이 실행되는 동안 블로킹(blocking)되어 다른 작업이 대기해야 하는 경우가 많다. 그러나 Coroutine은 suspend와 같은 중단 지점을 활용해 작업을 일시 중단하고 다른 Coroutine이 실행될 수 있도록 한다.
- 이로 인해 Coroutine은 비동기 처리를 더 간단하고 효율적으로 구현할 수 있다.
2. 비선점적 동작(Non-preemptive)
- Thread는 운영체제의 스케줄러에 의해 선점형(preemptive)으로 동작하여, 다른 스레드가 강제로 실행을 중단할 수 있다. 하지만 Coroutine은 비선점적(Non-preemptive)으로 동작하며, 명시적으로 중단(suspend) 지점을 지정하지 않는 한 작업이 중단되지 않는다.
- 이러한 특성은 복잡한 동기화 문제를 줄이고, 개발자가 작업 흐름을 명확히 제어할 수 있도록 한다.
3. 경량성(Lightweight)
- Thread는 생성과 관리가 무겁고, 제한된 개수만 생성할 수 있다. 반면, Coroutine은 스레드 위에서 동작하며, 하나의 스레드에서 수천 개의 Coroutine을 실행할 수 있다.
- 이는 Coroutine이 스택 메모리를 사용하지 않고, Continuation 객체를 통해 상태를 저장하고 관리하기 때문이다.
4. 문맥 교환 비용(Context Switching Cost)
- Thread는 문맥 교환 시 레지스터, 스택, 캐시 등을 저장하고 복원해야 하므로 비용이 크다. 반면, Coroutine은 단순히 Continuation 객체의 상태를 저장하고 복구하는 방식으로 동작하여 문맥 교환 비용이 매우 낮다.
Coroutine의 주요 키워드
- suspend
- Coroutine을 일시 중단(suspend)할 수 있는 지점을 정의한다.
- Coroutine은 중단된 상태에서 다른 작업을 수행하고, 필요한 시점에 재개(resume)된다.
- Dispatcher
- Coroutine이 실행될 스레드나 스레드 풀을 관리한다.
- 예를 들어, Dispatchers.Main은 UI 작업, Dispatchers.IO는 I/O 작업에 최적화된 환경을 제공한다.
- Structured Concurrency
- Coroutine은 구조적 동시성을 지원하여, 부모 Coroutine이 종료되기 전에 모든 자식 Coroutine이 완료되도록 보장한다.
- 이를 통해 리소스 누수와 같은 문제를 방지할 수 있다.
- Non-blocking
- Coroutine은 delay와 같은 함수로 스레드를 블로킹하지 않고도 특정 작업을 대기할 수 있다.
결론
Coroutine은 Thread와 비교하여 경량성, 비선점적 동작, 그리고 비동기 처리에서 강력한 장점을 가진다. Coroutine은 스레드를 효율적으로 활용하여 동시성을 처리하며, 코드의 가독성과 유지보수성을 높여준다. 이를 통해 개발자는 복잡한 비동기 로직을 간단하고 직관적으로 구현할 수 있다.
다음 글에서는 Coroutine 구성 요소인 아래의 항목들을 차례대로 다뤄보겠다.
- CoroutineScope
- CoroutineContext
- CoroutineBuilder
'Kotlin' 카테고리의 다른 글
| [Kotlin/코루틴] CoroutineContext 중 Job과 Dispatcher 정리하기 (1) | 2025.01.15 |
|---|---|
| [Kotlin/코루틴] Coroutine 구성 요소 소개 및 CoroutineScope 설명 (0) | 2025.01.15 |
| [Kotlin] 입출력 방식 비교와 코딩 테스트 빠른 입출력 최적화 방법 (2) | 2024.12.26 |
| [Kotlin/Java] 코틀린에서 Unit 이해하기 (void 친구): 싱글톤과 타입, 객체의 차이점 (1) | 2024.07.22 |
| [Kotlin] 싱글톤(Singleton)을 사용하는 이유 : kotlin object (1) | 2024.07.22 |