Skils/Kotlin

[Kotlin] break & continue, 내포된 루프와 레이블

재한 2022. 8. 17. 21:58

루프의 시작이나 끝 부분이 아닌 중간에서 종료 조건을 검사하면 편리할 수 있다.

이런 경우를 위해 코틀린은 몇 가지 식을 제공한다.

  • break는 즉시 루프를 종료시키고, 실행 흐름이 루프 바로 다음 문으로 이동하게 만든다.
  • continue는 현재 루프 이터레이션을 마치고 조건 검사로 바로 진행하게 만든다.

말로만 들으면 서로의 의미가 무엇인지 아마 헷갈릴 수 있다.

fun main() {
    val a=IntArray(10) {it}
    var sum=0
    for(x in 0..10){
        if(x==5){
            break;
        }
        print(x); //0,1,2,3,4
    }
}

위 경우에는 x가 5가되는 순간 break를 만나서 for문이 강제로 종료된다.

fun main() {
    val a=IntArray(10) {it}
    var sum=0
    for(x in 0..10){
        if(x==5){
               continue
        }
        print(x); //0,1,2,3,4,6,7,8,9
    }
}

위 경우에는 x가 0,1,2,3,4까지는 잘 실행되고 5가 되는 순간 continue를 만나서 종료가 아닌 다시 조건을 검사하는 위치로 가서 6부터 다시 루프를 반복한다.

break와 continue 식은 가장 안쪽에 내포된 루프에만 적용된다.

경우에 따라 더 밖에 있는 루프의 제어 흐름을 변경하고 싶을 때, 이를 위해 코틀린은 레이블 기능을 제공한다.

fun main() {
    val a=IntArray(10) {it}
    var sum=0
    aloop@ for(x in a.indices){
        for(y in 0..10 step 2){
            if(a[x]==y) {
                continue@aloop
            }
            println("${a[x]} $y")
        }
    }
}

바깥쪽 루프에 레이블(aloop)를 붙이고, 만약 안쪽 루프에서 해당 조건이 실행되면 바깥쪽 루프에 이터레이션을 끝내고 다음 이터레이션을 시작한다.

코틀린에서는 break와 continue에는 구체적으로 루프 앞에 붙은 레이블만 사용할 수 있다. 그렇지 않으면 컴파일러 오류를 보고한다!!

레이블 이름은 배열이나 함수와 마찬가지로 임의의 식별자가 될 수 있다.

✔정리

  • continue와 break는 내가 원래 사용하던 언어인 C++과 똑같았다.
  • 하지만 레이블을 이용한 continue와 break는 편리한 기능인 것 같다.
  • 내가 원하는 위치에 루프 문부터 이터레이션을 시작할 수 있기에 효율적인 코드를 작성할 수 있다.