Coroutine - Basic

2023. 4. 30. 23:21·📘 Backend/Kotlin

💡 Coroutine

코틀린에서 코루틴은 비동기 프로그래밍에 유용한 기능입니다.

코루틴을 사용하면 비동기 처리를 할 때 콜백 함수를 작성하지 않아도 되며, 코드의 가독성과 유지보수성도 높아집니다.

코루틴을 사용하기 위해서는 다음과 같은 과정이 필요합니다.


코루틴 라이브러리 추가하기

코루틴을 사용하기 위해서는 코루틴 라이브러리를 추가해야 합니다.

코루틴 라이브러리는 코틀린 표준 라이브러리의 일부이므로 별도의 설치나 설정이 필요하지 않습니다.

따라서, 프로젝트의 build.gradle 파일에 다음과 같이 의존성을 추가합니다.

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2'
}

코루틴 스코프 생성하기

코루틴을 실행하기 위해서는 코루틴 스코프를 생성해야 합니다. 코루틴 스코프는 코루틴 실행의 범위를 결정합니다.

예를 들어, 코루틴 스코프가 메인 스레드에서 생성된다면, 코루틴 실행도 메인 스레드에서 수행됩니다.

다음은 코루틴 스코프를 생성하는 예제 코드입니다.

import kotlinx.coroutines.*

fun main() {
    // 메인 스레드에서 코루틴 스코프 생성
    val scope = CoroutineScope(Dispatchers.Main)

    // ...
}

코루틴 작성하기

코루틴을 작성하는 방법에는 여러 가지가 있지만, 가장 기본적인 방법은 launch 함수를 사용하는 것입니다.

launch 함수는 비동기 코드를 실행하고, 결과를 반환하지 않습니다.

다음은 launch 함수를 사용하여 코루틴을 작성하는 예제 코드입니다.

import kotlinx.coroutines.*

fun main() {
    // 메인 스레드에서 코루틴 스코프 생성
    val scope = CoroutineScope(Dispatchers.Main)

    // 코루틴 실행
    scope.launch {
        // 비동기 작업 수행
    }

    // ...
}

코루틴 실행하기

코루틴은 launch, async, runBlocking 등의 함수를 통해 실행됩니다.


launch

launch 함수는 코루틴을 비동기적으로 실행하고 반환값이 없습니다.

코루틴의 결과를 처리하기 위해서는 Job 객체를 사용해야 합니다.

val job = GlobalScope.launch {
    // 비동기 작업 수행
}

async

async 함수는 launch와 유사하지만, 반환값이 있습니다.

Deferred 객체를 반환하며, await 함수를 호출하여 결과값을 얻을 수 있습니다.

val deferred = GlobalScope.async {
    // 비동기 작업 수행
    "Hello, World!"
}

val result = runBlocking {
    deferred.await()
}
println(result) // "Hello, World!"

runBlocking

runBlocking 함수는 메인 스레드를 블록하고, 전달된 블록 안에서 코루틴을 실행합니다.

반환값은 코루틴의 결과값입니다.

eval result = runBlocking {
    // 코루틴 작업 수행
    "Hello, World!"
}
println(result) // "Hello, World!"

위의 예제에서 runBlocking을 사용하여 메인 스레드가 블록되지 않고 결과값을 출력할 수 있습니다.

하지만 runBlocking은 UI 스레드에서 사용하면 안 됩니다.

또한, runBlocking은 테스트에서 코루틴을 실행할 때 사용됩니다.

예를 들어, JUnit 테스트에서 코루틴을 실행할 때 runBlocking을 사용할 수 있습니다.

저작자표시 (새창열림)

'📘 Backend > Kotlin' 카테고리의 다른 글

Kotlin - 구조 분해  (0) 2023.05.20
Kotest - Basic  (1) 2023.05.18
(Buffered)InputStream & OutputStream Class  (0) 2023.04.30
File Class  (0) 2023.04.30
File을 다루는 Class들  (0) 2023.04.30
'📘 Backend/Kotlin' 카테고리의 다른 글
  • Kotlin - 구조 분해
  • Kotest - Basic
  • (Buffered)InputStream & OutputStream Class
  • File Class
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      React #Markdown
      Lock #Thread #Concurrency
      GStreamer #Pipeline
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Coroutine - Basic
    상단으로

    티스토리툴바