04. 코루틴 방탈출 1번 문제 풀이

문제

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를 제외하고, 위에서부터 차례대로

  1. async
  2. launch
  3. coroutineScope 가 있다.

이 파일을 실행하게 된다면

  1. async를 이용한 코루틴 빌더로 runTest의 자식 코루틴 생성 및 시작
  2. launch를 이용한 코루틴 빌더로 runTest의 자식 코루틴 생성 및 시작
  3. coroutineScope를 이용한 아예 별도의 coroutine 생성
    1. 내부에서 launch를 이용한 coroutineScope의 자식 코루틴 생성 및 시작
    2. append 작업 실시
  4. async작업을 await으로 결과가 수신될 떄까지 대기
  5. append 작업 실시

정도가 된다.

조금 더 구체적으로는

  1. 우선 async가 실행이 되었지만 delay로 500밀리초만큼 기다리기 때문에 그동안은 append가 되지 않는다.
  2. launch 역시 delay로 200밀리초만큼 기다리기 때문에 그동안은 append가 되지 않는다.
  3. coroutineScope로 별도의 코루틴을 생성 후 launch로 자식 코루틴을 만들었지만 역시 delay로 300밀리초만큼 기다리기 때문에 그 동안은 append가 되지 않는다.
  4. launch를 실행한 이후 actual.append(4) 구문을 실행한다.
  5. await이 호출되어 async 구문이 끝날 때까지 아래로 내려가지 않고 대기한다.
  6. 그 동안 delay가 작아서 대기가 먼저 끝나는대로 append 작업이 실행되면서 2 -> 3 -> 1 순으로 추가되게 된다.
  7. 대기가 끝난 뒤에 5를 추가한다.

즉 정답은 “42315”가 된다.


© 2025. Na2te All rights reserved.