Home 코루틴의 수신객체
Post
Cancel

코루틴의 수신객체

코루틴의 수신 객체 이해하기

코루틴을 사용하다 보면 수신 객체라는 개념이 등장합니다. 코틀린에 익숙하지 않은 경우, 수신 객체가 어떻게 동작하는지 헷갈릴 수 있습니다. 특히 코루틴을 공부할 때 람다식과 수신 객체에 대한 이해가 중요합니다.

수신 객체란?

수신 객체(receiver object)는 특정 객체의 컨텍스트에서 함수가 호출되는 것을 의미합니다. 코틀린에서는 람다식을 통해 수신 객체를 지정할 수 있습니다. 수신 객체를 사용하면, 특정 객체의 맥락에서 함수를 호출할 수 있게 됩니다.

다음 예제 코드를 통해 수신 객체를 이해해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
fun <T> test(block: String.() -> T): T { 
    val result: T = block.invoke("수신 객체")
    return result
}

fun main() {
    val result = test {
        this.length  // "수신 객체"의 length를 호출
    }
    println(result)  // 출력: 5
}

위 함수 testString의 확장 함수를 인자로 받는 고차 함수입니다. 이 확장 함수가 호출될 때, “수신 객체”라는 String 인스턴스가 만들어져서 해당 람다식의 수신 객체가 됩니다. 따라서 this 키워드를 사용하여 “수신 객체”에 접근할 수 있습니다.

코루틴에서의 수신 객체

코루틴에서는 수신 객체가 중요한 역할을 합니다. runBlocking 함수와 launch 함수는 모두 CoroutineScope의 확장 함수를 인자로 받는 고차 함수입니다. 이 함수들이 호출될 때, 내부적으로 CoroutineScope의 인스턴스를 만들어서 수신 객체로 주입합니다.

runBlocking 함수

runBlocking 함수는 코루틴을 블로킹 방식으로 실행합니다. 이 함수는 CoroutineScope의 확장 함수를 인자로 받습니다.

1
2
3
4
5
6
public fun <T> runBlocking(
    context: CoroutineContext = EmptyCoroutineContext, 
    block: suspend CoroutineScope.() -> T
): T {
    // 내부 구현 생략
}

runBlocking 함수는 내부에서 BlockingCoroutine이라는 구현체를 인스턴스화해서 주입합니다. 이를 통해 block 람다식은 CoroutineScope의 맥락에서 실행됩니다.

1
2
3
fun main() = runBlocking {
    println("Hello, ${this.coroutineContext}")
}

위 예제에서 runBlocking 내부의 block 람다식은 CoroutineScope의 확장 함수로 실행됩니다. this 키워드를 통해 CoroutineScope의 멤버에 접근할 수 있습니다.

launch 함수

launch 함수는 새로운 코루틴을 시작합니다. 이 함수도 CoroutineScope의 확장 함수를 인자로 받습니다.

1
2
3
4
5
6
7
public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job {
    // 내부 구현 생략
}

launch 함수는 내부에서 StandaloneCoroutine이라는 구현체를 인스턴스화해서 주입합니다. 이를 통해 block 람다식은 CoroutineScope의 맥락에서 실행됩니다.

1
2
3
4
5
fun main() = runBlocking {
    launch {
        println("Hello from launch, ${this.coroutineContext}")
    }
}

위 예제에서 launch 함수는 runBlocking 내에서 호출되며, block 람다식은 CoroutineScope의 확장 함수로 실행됩니다.

결론

코루틴에서 수신 객체는 중요한 개념입니다. 수신 객체를 이해하면, 코루틴의 동작 방식을 보다 명확하게 이해할 수 있습니다. 확장 함수와 람다식을 통해 특정 객체의 맥락에서 함수를 호출하는 방법을 익히는 것은 코틀린과 코루틴을 효과적으로 사용하는 데 큰 도움이 됩니다.

This post is licensed under CC BY 4.0 by the author.
Trending Tags