작성
·
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번 시도 이후 해당 반복을 종료해버리니 위와 같은 차이가 발생하게 됩니다!
강의 보시면서 또 궁금한 점 있으시면 편하게 질문 주세요!
감사합니다!! 😊 🙇