[kotlin] 코틀린에서의 비동기 처리 방법

코틀린은 Java와 달리 비동기 처리를 간편하게 할 수 있는 기능을 제공합니다. 이를 통해 다양한 비동기 작업을 처리할 수 있고, 애플리케이션의 성능을 향상시킬 수 있습니다.

코루틴을 이용한 비동기 처리

코틀린의 핵심 비동기 처리 기능은 코루틴(coroutine)이라는 개념을 사용합니다. 코루틴은 일반적인 스레드보다 가벼운 흐름 제어 구조로, 비동기 작업을 순차적으로 수행하면서도 동시에 여러 작업을 처리할 수 있습니다.

import kotlinx.coroutines.*

fun main() {
    GlobalScope.launch { // 비동기 처리를 위한 새로운 코루틴 생성
        println("비동기 작업 시작")
        delay(1000) // 1초 대기
        println("비동기 작업 완료")
    }
    println("메인 스레드 계속 실행")
    Thread.sleep(2000) // 메인 스레드 2초 대기
}

위의 예제에서는 launch 함수를 사용하여 새로운 코루틴을 생성하고, delay 함수로 비동기 작업을 수행합니다. 비동기 작업이 완료되기 전에도 메인 스레드는 계속 실행됩니다.

비동기 작업 결과 처리

비동기 작업이 완료된 후에는 결과를 처리해야 합니다. 이를 위해 await 함수나 invokeOnCompletion 함수를 사용할 수 있습니다.

import kotlinx.coroutines.*

fun main() {
    val deferred = GlobalScope.async { // 비동기 처리를 위한 새로운 코루틴 생성 후 Deferred 객체 반환
        println("비동기 작업 시작")
        delay(1000) // 1초 대기
        "비동기 작업 결과"
    }
    println("메인 스레드 계속 실행")
    Thread.sleep(2000) // 메인 스레드 2초 대기
    runBlocking {
        val result = deferred.await() // 비동기 작업이 완료될 때까지 대기하고 결과 받기
        println("비동기 작업 결과: $result")
    }
}

위의 예제에서는 async 함수를 이용해 비동기 작업을 수행한 후, await 함수를 통해 작업의 결과를 반환받습니다. await 함수는 비동기 작업이 완료될 때까지 대기하고 결과를 받아옵니다.

예외 처리

비동기 작업 중에 예외가 발생할 수 있으므로 예외 처리를 제대로 해주어야 합니다. 코루틴은 try-catch 블록을 사용하여 예외 처리를 할 수 있습니다.

import kotlinx.coroutines.*

fun main() {
    val deferred = GlobalScope.async { 
        println("비동기 작업 시작")
        delay(1000) 
        throw Exception("비동기 작업 중 예외 발생") // 예외 발생
    }
    println("메인 스레드 계속 실행")
    Thread.sleep(2000) 
    runBlocking {
        try {
            val result = deferred.await() 
            println("비동기 작업 결과: $result")
        } catch (e: Exception) {
            println("비동기 작업 중 예외 발생: ${e.message}")
        }
    }
}

위의 예제에서는 비동기 작업 중에 예외가 발생하면 try-catch 블록에서 예외를 처리합니다.

정리

코틀린의 코루틴을 활용하여 비동기 작업을 처리할 수 있습니다. 비동기 작업의 결과는 await 함수를 사용하여 확인하고, 예외 처리는 try-catch 블록을 통해 처리합니다. 이를 통해 좀 더 간결하고 효율적인 비동기 프로그래밍을 할 수 있습니다.

참고 자료