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개의 댓글

관련 채용 정보