[코틀린] 스코프 빌더

도톨이·2024년 7월 7일

Kotlin

목록 보기
1/10

코루틴 스코프는 코루틴을 제대로 처리하기 위한 정보인 코루틴 컨텍스트를 가진다. 이는 this.coroutineContext 로 가져올 수 있다.

runBlocking 코루틴 빌더

runBlocking 은 코드 블록 수행하기 전까지 다른 애들을 못하게 막아둔다.
아래의 예시에서 runBlocking 을 하면 해당 코드 블록을 수행하기 전까지 다른 애들을 막기 때문에 다음과 같은 결과가 나온다. Start of main -> Inside runBlocking -> End of runBlocking -> End of main

fun main() {
    println("Start of main")

    runBlocking {
        println("Inside runBlocking")
        delay(1000L)
        println("End of runBlocking")
    }

    println("End of main")
}

lauch 코루틴 빌더

이번엔 lauch 코루틴 빌더이다. runBlocking 은 코드 블록 수행하기 전까지 다른 애들을 못하게 막는건데 lauch 는 할 수 있다면 같이 수행되는 것이다.

예를 들어 아래 코드에서 runBlocking 이 먼저 호출이 되어서 Hello 가 먼저 출력되고 그 다음에 World 가 출력된다. runBlocking 은 코드 수행까지 기다리고 launch 는 기다리지 않는다.

fun main() = runBlocking {
	lauch{
   		print("World")
        }
        print("Hello")
        }

delay 함수

잠깐 쉬어가는 함수이다. 일반적으로 스레도에서 쉬려면 sleep 을 사용했었다. delay 는 해당 스레드를 해제를 하고 쉬는 것이다. 이건 sleep 과 달리 해제해서 다른 애가 쓸 수 있도록 할 수 있다.
딜레이 함수에 지정하는 값은 L 값인데 이건, 밀리세컨드 단위이다. delay(500L) = 500 밀리세컨드

아래 코드 예시에서는 World 가 먼저 호출되고 Hello 가 호출된다. delay 에서 잠깐 스레드 해제를 해서 lauch 가 먼저 쓰도록 양보하기 때문이다.

fun main() = runBlocking {
	lauch{
   		print("World")
        }
        delay(500L)
        print("Hello")
        }

코루틴의 장점 : 하나의 스레드 밖에 없지만 양보를 하며 최선의 효율을 내는 것.

만약 delay 가 아닌 sleep 을 쓰면 다른 스레드에게 양보하지 않고 자기가 바쁘게 쉬는 거여서 runBlocking 이 먼저 실행되고 나서 launch 가 실행된다.
따라서, 아래 예시에서 Hello 가 먼저 출력되고 World 가 출력된다.

fun main() = runBlocking {
	lauch{
   		print("World")
        }
        Thread.sleep(500)
        print("Hello")
        }
profile
Kotlin, Flutter, AI | Computer Science

0개의 댓글