개발 언어/코틀린
kotlin - coroutine (1) 코루틴의 기초 개념
jjiiiinn
2024. 9. 5. 10:54
728x90
1. 코루틴의 기초 개념
1.1 코루틴이란 무엇인가?
코루틴(Coroutines)은 비동기 작업을 쉽게 처리하기 위한 경량 스레드라고 생각할 수 있습니다. 코틀린의 코루틴은 실제 스레드를 차지하지 않으면서도 비동기 작업을 수행할 수 있습니다. 비동기 프로그래밍의 복잡함을 줄이고, 코드가 동기적으로 실행되는 것처럼 보이면서도 효율적인 비동기 작업을 가능하게 해줍니다.
1.2 코루틴의 장점과 스레드와의 차이점
- 경량성: 코루틴은 스레드에 비해 매우 가볍습니다. 수천 개의 코루틴이 실행되더라도 시스템 리소스를 많이 차지하지 않습니다.
- 비동기 처리: 코루틴은 비동기 처리를 단순하게 만듭니다. 기존의 스레드를 사용한 비동기 처리에 비해 코드가 더 직관적입니다.
- 중단 및 재개 가능:
suspend
키워드를 통해 코루틴은 일시 중단되고 다시 재개될 수 있습니다. - 구조화된 동시성: 코루틴은 부모-자식 관계로 실행되어, 예외 처리가 더 쉽고 안전합니다.
1.3 코루틴 빌더 (launch
, async
)
코루틴을 시작할 때 사용하는 대표적인 두 가지 함수는 launch
와 async
입니다. 이 둘은 비슷하지만, launch
는 결과를 반환하지 않고, async
는 결과를 반환하는 비동기 작업을 의미합니다.
launch
: 결과를 반환하지 않는 코루틴을 시작합니다.async
: 결과를 반환하는 코루틴을 시작하며, 반환된 값을 나중에await
로 받아올 수 있습니다.
1.4 간단한 프로젝트 구성
이제 기초적인 코루틴 예제를 통해 직접 사용해보겠습니다.
프로젝트 구성
- Main.kt: 코루틴 기초 코드 작성
import kotlinx.coroutines.*
fun main() = runBlocking { // runBlocking은 코루틴을 블로킹 방식으로 실행하는 역할을 합니다.
// launch를 이용해 새로운 코루틴을 시작합니다.
launch {
delay(1000L) // 코루틴이 1초간 대기합니다.
println("World!") // 1초 뒤에 실행됩니다.
}
println("Hello,") // 이 부분은 즉시 실행됩니다.
}
1.5 예제 코드 설명
runBlocking
: 코루틴을 시작하는 가장 기본적인 방법으로, 현재 스레드를 블로킹하면서 내부에서 코루틴을 실행합니다. 보통 테스트 코드나 예제에서 사용됩니다.launch
: 새로운 코루틴을 생성하고,delay
함수를 사용해 1초 후에"World!"
라는 문장을 출력합니다.delay
: 실제로 스레드를 차단하지 않고, 코루틴을 지연시킵니다. 마치Thread.sleep()
과 비슷해 보이지만, 코루틴 내부에서만 작동하며 리소스를 많이 사용하지 않습니다.
1.6 테스트 코드
이 코드를 실행하면 다음과 같은 출력이 나옵니다.
Hello,
World!
여기서 Hello,
는 즉시 출력되고, World!
는 1초 뒤에 출력됩니다. 이는 launch
에서 생성된 코루틴이 비동기로 실행되었기 때문입니다.
추가 실습 코드 (async 사용)
이제 async
를 사용한 예제를 추가로 살펴보겠습니다.
fun main() = runBlocking {
val deferred = async {
println("async start!!")
delay(2000L)
"Hello, World!"
}
delay(1000L)
println("Waiting for result...")
val result = deferred.await() // 결과를 받아오기 위해 await() 사용
println(result)
}
설명:
async
는 비동기 작업을 시작하며,deferred
라는 값을 반환합니다.await()
를 실행하면 비동기 작업을 시작하는것이 아닌 async 블록이 닿으면 바로 시작함.
await()
은async
에서 반환된 값을 실제로 기다렸다가 가져오는 역할을 합니다.
출력은 다음과 같습니다:
async start!!
Waiting for result...
Hello, World!
이렇게 launch
는 결과가 필요 없을 때 사용하고, async
는 결과가 필요할 때 사용합니다.
728x90