문제
1번 문제는 아래와 같은 Coroutine들이 있을 때 실행 순서 맞추기이다.
// file: "문제 1번.kt"
class Step1 {
@Test
fun `종류별 Scope`() = runTest {
// given
val actual: StringBuilder = StringBuilder()
// when
val deferred = async {
delay(500)
actual.append(1)
}
launch {
delay(200)
actual.append(2)
}
coroutineScope {
launch {
delay(300)
actual.append(3)
}
actual.append(4)
}
deferred.await()
actual.append(5)
// then
val expected = "" // TODO: 결과값 예상
/*
TODO: 간단한 풀이과정 작성
*/
// assert문 수정하지 마세요!
assertHashcode(actual, expected)
}
}
풀이
우선 크게 코루틴을 분리해보자
runTest를 제외하고, 위에서부터 차례대로
- async
- launch
- coroutineScope 가 있다.
이 파일을 실행하게 된다면
- async를 이용한 코루틴 빌더로 runTest의 자식 코루틴 생성 및 시작
- launch를 이용한 코루틴 빌더로 runTest의 자식 코루틴 생성 및 시작
- coroutineScope를 이용한 아예 별도의 coroutine 생성
- 내부에서 launch를 이용한 coroutineScope의 자식 코루틴 생성 및 시작
- append 작업 실시
- async작업을 await으로 결과가 수신될 떄까지 대기
- append 작업 실시
정도가 된다.
조금 더 구체적으로는
- 우선 async가 실행이 되었지만 delay로 500밀리초만큼 기다리기 때문에 그동안은 append가 되지 않는다.
- launch 역시 delay로 200밀리초만큼 기다리기 때문에 그동안은 append가 되지 않는다.
- coroutineScope로 별도의 코루틴을 생성 후 launch로 자식 코루틴을 만들었지만 역시 delay로 300밀리초만큼 기다리기 때문에 그 동안은 append가 되지 않는다.
- launch를 실행한 이후
actual.append(4)구문을 실행한다. - await이 호출되어 async 구문이 끝날 때까지 아래로 내려가지 않고 대기한다.
- 그 동안 delay가 작아서 대기가 먼저 끝나는대로 append 작업이 실행되면서 2 -> 3 -> 1 순으로 추가되게 된다.
- 대기가 끝난 뒤에 5를 추가한다.
즉 정답은 “42315”가 된다.