개발 언어/코틀린

kotlin - coroutine (1) 코루틴의 기초 개념

jjiiiinn 2024. 9. 5. 10:54
728x90

1. 코루틴의 기초 개념

1.1 코루틴이란 무엇인가?

코루틴(Coroutines)은 비동기 작업을 쉽게 처리하기 위한 경량 스레드라고 생각할 수 있습니다. 코틀린의 코루틴은 실제 스레드를 차지하지 않으면서도 비동기 작업을 수행할 수 있습니다. 비동기 프로그래밍의 복잡함을 줄이고, 코드가 동기적으로 실행되는 것처럼 보이면서도 효율적인 비동기 작업을 가능하게 해줍니다.

1.2 코루틴의 장점과 스레드와의 차이점

  • 경량성: 코루틴은 스레드에 비해 매우 가볍습니다. 수천 개의 코루틴이 실행되더라도 시스템 리소스를 많이 차지하지 않습니다.
  • 비동기 처리: 코루틴은 비동기 처리를 단순하게 만듭니다. 기존의 스레드를 사용한 비동기 처리에 비해 코드가 더 직관적입니다.
  • 중단 및 재개 가능: suspend 키워드를 통해 코루틴은 일시 중단되고 다시 재개될 수 있습니다.
  • 구조화된 동시성: 코루틴은 부모-자식 관계로 실행되어, 예외 처리가 더 쉽고 안전합니다.

1.3 코루틴 빌더 (launch, async)

코루틴을 시작할 때 사용하는 대표적인 두 가지 함수는 launchasync입니다. 이 둘은 비슷하지만, 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