코루틴의 수신 객체 이해하기
코루틴을 사용하다 보면 수신 객체라는 개념이 등장합니다. 코틀린에 익숙하지 않은 경우, 수신 객체가 어떻게 동작하는지 헷갈릴 수 있습니다. 특히 코루틴을 공부할 때 람다식과 수신 객체에 대한 이해가 중요합니다.
수신 객체란?
수신 객체(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
}
위 함수 test
는 String
의 확장 함수를 인자로 받는 고차 함수입니다. 이 확장 함수가 호출될 때, “수신 객체”라는 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
의 확장 함수로 실행됩니다.
결론
코루틴에서 수신 객체는 중요한 개념입니다. 수신 객체를 이해하면, 코루틴의 동작 방식을 보다 명확하게 이해할 수 있습니다. 확장 함수와 람다식을 통해 특정 객체의 맥락에서 함수를 호출하는 방법을 익히는 것은 코틀린과 코루틴을 효과적으로 사용하는 데 큰 도움이 됩니다.