IMCAT.DEV
로그인 가입
Kotlin 중급 비동기

Kotlin 코틀린 코루틴 기초

Kotlin 코틀린 코루틴 기초 — 중급

코틀린 코루틴 기초

1. 도입 (왜 배워야 하는가)

코틀린 코루틴은 비동기 프로그래밍을 간편하게 처리할 수 있는 강력한 도구입니다. 실무에서 다양한 애플리케이션을 개발할 때, 사용자 경험을 향상시키기 위해 비동기 작업이 필수적입니다. 예를 들어, 네트워크 요청을 처리하거나 데이터베이스와 상호작용하는 경우, 메인 스레드를 차단하지 않고 작업을 수행해야 합니다. 만약 코루틴을 사용하지 않는다면, 긴 작업이 진행되는 동안 사용자 인터페이스가 멈추거나 응답하지 않는 문제가 발생할 수 있습니다. 이는 사용자 경험을 크게 저하시킬 수 있습니다.

2. 핵심 개념 설명

코루틴은 경량 스레드로, 비동기 작업을 순차적으로 작성할 수 있게 해줍니다. 이를 통해 복잡한 콜백 구조를 피할 수 있습니다.

  • 코루틴 (Coroutine): 스레드와 비슷하게 동작하지만, 훨씬 가볍고, 여러 개의 코루틴을 동시에 실행할 수 있습니다.
  • 디스패처 (Dispatcher): 코루틴이 어떤 스레드에서 실행될지를 결정합니다. 예를 들어, Dispatchers.Main은 UI 스레드에서 실행되고, Dispatchers.IO는 입출력 작업을 위한 스레드입니다.
  • 용어설명
    코루틴경량 스레드로 비동기 작업을 쉽게 처리
    디스패처코루틴이 실행될 스레드를 결정

    3. 기본 코드 예제

    아래는 기본적인 코루틴 사용법을 보여주는 예제입니다.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        // 코루틴 시작
        launch {
            delay(1000L) // 1초 대기
            println("코루틴 실행 완료!")
        }
        println("코루틴 시작!") // 이 문장은 먼저 출력됩니다.
    }

    실행 결과

    코루틴 시작!
    코루틴 실행 완료!
  • runBlocking { ... }: 메인 스레드에서 코루틴을 실행합니다.
  • launch { ... }: 새로운 코루틴을 시작합니다.
  • delay(1000L): 1초 동안 대기합니다. 이 시간 동안 다른 코루틴이 실행될 수 있습니다.
  • println("코루틴 시작!"): 코루틴이 시작되기 전에 출력됩니다.
  • 4. 실전 활용 예제

    예제 1: 네트워크 요청 처리

    쇼핑몰에서 상품 정보를 가져오는 작업을 비동기적으로 처리하는 경우입니다.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        launch(Dispatchers.IO) {
            val productInfo = fetchProductInfo() // 네트워크 요청
            withContext(Dispatchers.Main) {
                println("상품 정보: $productInfo") // UI에 출력
            }
        }
    }
    
    suspend fun fetchProductInfo(): String {
        delay(2000L) // 네트워크 지연 시뮬레이션
        return "상품 A"
    }

    예제 2: 데이터베이스 작업

    장바구니에 있는 상품을 데이터베이스에서 불러오는 경우입니다.

    import kotlinx.coroutines.*
    
    fun main() = runBlocking {
        launch(Dispatchers.IO) {
            val cartItems = loadCartItems() // 데이터베이스 작업
            withContext(Dispatchers.Main) {
                println("장바구니 상품: $cartItems") // UI에 출력
            }
        }
    }
    
    suspend fun loadCartItems(): List<String> {
        delay(1500L) // 데이터베이스 지연 시뮬레이션
        return listOf("상품 A", "상품 B")
    }

    5. 흔한 실수와 주의사항

    실수 1: 메인 스레드에서 블로킹 작업 수행

    // 잘못된 코드
    fun main() {
        fetchProductInfo() // 메인 스레드에서 블로킹
    }
  • 잘못된 코드: 메인 스레드에서 네트워크 요청을 수행하여 UI가 멈춤.
  • 올바른 코드: 코루틴 내에서 비동기적으로 처리해야 함.
  • 실수 2: 코루틴의 결과를 사용하지 않음

    // 잘못된 코드
    fun main() = runBlocking {
        launch {
            val result = fetchProductInfo()
            // 사용하지 않음
        }
    }
  • 잘못된 코드: 결과를 사용하지 않아 불필요한 요청이 발생.
  • 올바른 코드: 결과를 적절히 사용하거나 출력해야 함.
  • 6. 정리

  • 코틀린 코루틴은 비동기 작업을 쉽게 처리할 수 있도록 해줍니다.
  • 다양한 디스패처를 통해 스레드를 효율적으로 사용할 수 있습니다.
  • 코루틴을 사용해 UI를 블로킹하지 않고 비동기 작업을 수행하는 것이 중요합니다.
  • 다음에 학습할 주제로는 코루틴의 에러 처리와 Flow를 추천합니다.