Kotlin 심화문법

박재원·2023년 12월 13일
0

TIL

목록 보기
12/50
post-thumbnail

동기 프로그래밍

  • 요청을 보내고 결과값을 받을 때까지 작업을 멈춘다.
  • 한 가지씩 작업을 처리한다. 즉 하나의 코드가 끝나야 다음 코드가 실행된다.
import kotlinx.coroutines.*

fun main() {
    runBlocking{
    println("Weather forecast")
    delay(1000)
    println("Sunny")
    }
}

runBlocking 함수는 동기식으로 람다식 안에 있는 모든 작업이 완료되어야 함수를 반환합니다.

비동기 프로그래밍

  • 요청을 보내고 결과값을 받을 때까지 다른 일을 수행한다.
  • 여러가지 일을 한 번에 수행한다.
  • UI 어플리케이션의 경우 특정 이벤트가 발생한 경우 반응하는 동작 구현을 하기 위해 비동기 프로그래밍이 필수적으로 사용된다.
import kotlinx.coroutines.*

fun main() {
    runBlocking {
        println("Weather forecast")
        launch{
        printForecast()
        }
        launch{
        printTemperature()
        }
    }
}

suspend fun printForecast() {
    delay(1000)
    println("Sunny")
}

suspend fun printTemperature() {
    delay(1000)
    println("30\u00b0C")
}

printForecast()와 printTemperature()가 별개의 코루틴에 있으므로 동시에 실행할 수 있습니다.

쓰레드

  • 프로그램은 하나의 메인 쓰레드가 존재한다.
  • 별도의 자식 쓰레드를 생성해서 동시에 로직을 실행할 수 있다.
fun main() {
    thread(start = true) {
        for(i in 1..10) {
            println("Thread1: 현재 숫자는 ${i}")
            runBlocking {
                launch {
                    delay(1000)
                }
            }
        }
    }

    thread(start = true) {
        for(i in 50..60) {
            println("Thread2: 현재 숫자는 ${i}")
            runBlocking {
                launch {
                    delay(1000)
                }
            }
        }
    }
}

위 코드를 실행하게 되면 두 개의 쓰레드가 실행되면서 1 ~ 10, 50 ~ 60 이 동시에 1초 간격으로 출력된다.

코루틴

  • 쓰레드와 기능적으로는 같지만, 쓰레드에 비교하면 좀 더 가볍고 유연한 병렬 프로그래밍을 위한 기술이다.
print("Start...")
GlobalScope.launch(Dispatchers.Main) {
    val job1 = async(Dispatchers.IO) {
        var total = 0
        for (i in 1..10) {
            total += i
            delay(100)
        }
        print("job1")
        total
    }
    val job2 = async(Dispatchers.Main) {
        var total = 0
        for (i in 1..10) {
            delay(100)
            total += i
        }
        print("job2")
        total
    }
    val result1 = job1.await()
    val result2 = job2.await()
    print("results are $result1 and $result2")
}
print("End.")

v: Start...
v: Eed.
v: job1
v: job2
v: results are 55 and 55

Dispatchers.Main, Dispatchers.IO는 각각 UI 변경 등을 처리하는 메인 스레드 그리고 입출력 연산을 처리하기에 적합한 IO 스레드를 의미하며, 코루틴들은 이처럼 지정된 스레드 내에서 실행된다.

0개의 댓글