[kotlin] 코틀린에서의 작업 스레드와 UI 스레드 처리 방법

안드로이드 앱을 개발하다 보면 작업 스레드와 UI 스레드를 적절히 처리해야 합니다. 작업 스레드는 긴 작업이나 네트워크 요청 등을 처리하는데 사용되며, UI 스레드는 앱의 화면을 업데이트하고 사용자와 상호작용하는 역할을 담당합니다. 이번 글에서는 코틀린에서 작업 스레드와 UI 스레드를 어떻게 처리하는지 알아보도록 하겠습니다.

작업 스레드

코틀린에서 작업 스레드를 생성하고 실행하는 가장 간단한 방법은 Thread 클래스를 사용하는 것입니다. 다음은 작업 스레드를 생성하고 실행하는 예시 코드입니다.

Thread {
    // 작업 스레드에서 실행될 코드
    // ...
}.start()

위의 코드에서 Thread 클래스의 생성자에 작업 스레드에서 실행될 코드를 람다 형태로 전달합니다. 그리고 start() 메서드를 호출하여 작업 스레드를 실행시킵니다.

또 다른 방법으로는 Executor 인터페이스를 사용하는 것입니다. 코틀린에서는 ExecutorService라는 인터페이스를 제공하여 작업 스레드 풀을 생성하고 관리할 수 있습니다. 다음은 작업 스레드 풀을 생성하고 작업을 제출하는 예시 코드입니다.

val executor: ExecutorService = Executors.newFixedThreadPool(4)

executor.submit {
    // 작업 스레드에서 실행될 코드
    // ...
}

// executor.shutdown() // 작업 스레드 풀 종료

위의 코드에서 Executors.newFixedThreadPool(4)를 사용하여 4개의 작업 스레드를 가지는 작업 스레드 풀을 생성합니다. submit() 메서드를 호출하여 작업을 제출하면 작업 스레드 풀에서 해당 작업을 실행합니다.

UI 스레드

UI 스레드에서 실행되어야 하는 작업은 runOnUiThread 메서드를 사용하여 처리할 수 있습니다. 다음은 UI 스레드에서 실행되는 작업을 처리하는 예시 코드입니다.

runOnUiThread {
    // UI 스레드에서 실행될 코드
    // ...
}

runOnUiThread 메서드는 액티비티 클래스에 포함된 메서드로, UI 스레드에서 실행될 블록을 전달하면 그 블록이 UI 스레드에서 실행됩니다.

스레드간 데이터 전달

작업 스레드와 UI 스레드 간에 데이터를 전달해야 할 때에는 Handler 클래스나 runOnUiThread 메서드를 사용할 수 있습니다. 하지만 코틀린에서는 Coroutine을 사용하여 보다 쉽게 데이터를 전달할 수 있습니다. 다음은 코루틴을 사용하여 스레드간 데이터를 전달하는 예시 코드입니다.

lifecycleScope.launch(Dispatchers.Main) {
    val result = withContext(Dispatchers.IO) {
        // 작업 스레드에서 실행될 코드
        // ...
        "작업 스레드에서의 결과"
    }

    // UI 스레드에서 실행될 코드
    // 결과를 UI 요소에 업데이트하는 등의 작업
    // ...
}

위의 코드에서 lifecycleScope는 Android Jetpack 라이브러리에서 제공하는 라이프사이클 범위를 나타내며, launch 함수를 호출하여 코드 블록을 비동기로 실행합니다. withContext 함수를 사용하여 일시적으로 다른 스레드에서 실행될 코드를 지정하고, 그 결과를 result 변수에 저장합니다.

결론

코틀린에서 작업 스레드와 UI 스레드를 처리하기 위해 Thread, ExecutorService, runOnUiThread, 그리고 코루틴을 사용할 수 있습니다. 앱 개발 시 각 스레드의 역할과 특성을 이해하고 적절하게 사용하면 앱의 성능과 안정성을 향상시킬 수 있습니다.

참고 자료: