인프런 커뮤니티 질문&답변

Olive님의 프로필 이미지
Olive

작성한 질문수

2시간으로 끝내는 코루틴

4강. 코루틴의 취소

코루틴 취소 관련 질문

작성

·

225

1

fun main(): Unit = runBlocking {
    val job = launch {
        var i = 1
        var nextPrintTime = System.currentTimeMillis()
        while (i <= 5) {
            if(nextPrintTime <= System.currentTimeMillis()){
                printWithThread("${i++}번째 출력!")
                nextPrintTime += 1_000L
            }
        }
    }

    delay(100L)
    job.cancel()
}

수업 때 예시로 보여주신 코드인데 이 코드는 "5번째 출력!"까지 출력하고 끝이 나는데요.

 

반면에 아래 코드는 한번만 출력하고 끝이 납니다.

fun main(): Unit = runBlocking {
    val job = launch {
        var nextPrintTime = System.currentTimeMillis()
        repeat(5) {
            if (nextPrintTime <= System.currentTimeMillis()) {
                printWithThread("${it + 1}번째 출력!!")
                nextPrintTime += 1_000L
            }
        }
    }

    delay(100L)
    job.cancel()
}

이는 단순히 repeat문이 무한루프가 아니어서 나오는 차이일까요?

답변 1

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요 Olive님! 질문 주셔서 감사합니다! 😊

네네 맞습니다, repeat 문이기 때문에 다음과 같이 동작하는 것으로 생각해주시면 되어요!

repeat(5) {
  if (...) 
}

 

  • 각 코드 한 줄 한 줄 마다 대략적으로 1ms가 걸린다고 생각해보자! (실제로는 1ms 보다 더 적게 걸릴겁니다!) 또한, repeat 으로 코드가 넘어오기 전 nextPrintTime = 0이라고 생각하자.

  • 그럼 최초 repeat이 수행되면, 0 <= 1 이니 if 조건이 true이고 if 안의 코드가 실행될겁니다.

    • 이때 한 번 출력이 되고, nextPrintTime = 1000 이 되겠죠!

  • 다음으로 두 번째 repeat이 수행될 건데, 코드 한 줄당 1ms가 걸리면 잘 쳐줘도 4~5ms 정도 지났을테니 1000 <= 4라서 if 조건이 false가 됩니다.

    • 따라서 두 번째 repeat은 pass될거에요!

  • 비슷하게 세 번째 repeat은 1000 <= 5라서 false, 네 번째 repeat 역시 false, 다섯 번째까지 false가 나오면서 최종적으로 한 번만 출력된 이후 프로그램은 종료하게 됩니다.

 

만약 무한루프였다면, 어쨌거나 5번의 출력을 할동안 위의 과정을 수백번, 수천번 반복하겠지만 repeat은 말 그대로 N번 시도 이후 해당 반복을 종료해버리니 위와 같은 차이가 발생하게 됩니다!

 

강의 보시면서 또 궁금한 점 있으시면 편하게 질문 주세요!

감사합니다!! 😊 🙇

Olive님의 프로필 이미지
Olive

작성한 질문수

질문하기