Computer Science/Etc

코틀린(Kotlin)에서 중첩 반복문 빠져나오는 방법

TwinParadox 2018. 10. 3. 12:07
728x90

과거에 입문 언어로 선택되었던 언어들과 현재 많은 사람들이 쓸 줄은 아는 언어들, C, C++, Java 같은 것들은 중첩반복문을 빠져나오려면 별도의 플래그가 필요했다. 프로그래밍 자체에 서툰 사람들은 이 플래그 개념에서 헤매는 경우가 많았다. 적어도 필자 경험 상, 많은 학부생이 그랬다.


반복문이라는 것이 처음 접하는 사람에게는 어디까지 반복되는지 감이 잘 안 오는 제어문인 데다가, 제어문의 범위에 대해서 완벽히 숙지되지 않은 사람들에게는 반복문을 중단시키는 것 자체가 이해가 되지 않는 경우가 많다.



반복문 내부에 있는 반복문에서 break로 반복 작업을 중단시킨다고 하더라도, 그것을 둘러싸고 있는 반복문(여기서는 바깥 반복문이라고 하겠다.)을 중단시키는 것은 아니다. 따라서 바깥 반복문에 대해서 계속 작업을 진행할 것인지를 확인하는 별도의 장치가 필요한데, 이를 플래그(Flag)로 처리했다.



예를 들어보자. 어떤 두 수(count1, count2)를 1부터 반복문으로 계속 증가시켜 나간다고 하자. 이 때 두 수의 곱(count1*count2)이 10이 되는 시점부터 반복문을 중단하게 만들고 싶다면, 어떻게 해야 할까?




플래그 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fun main(args:Array<String>) {
    var flags=1
    for (count1 in 1..10) {
        if(flags!=1) {
            break
        }
        for (count2 in 1..5) {
            println("$count1, $count2")
            if(count1*count2==10) {
                flags = 2
                break
            }
        }
    }
}
cs


코틀린 중첩 반복문 - 플래그




플래그를 사용해서 중첩 반복문을 빠져나오는 방법은 이렇다. 반복문과 조건문만 있으면 얼마든지 사용 가능한 방법이고, 코틀린에서도 사용 가능하다. 하지만, 코틀린에서는 이런 방법 외에 또 다른 방법을 제공한다.




라벨 사용


1
2
3
4
5
6
7
8
9
10
fun main(args:Array<String>) {
    loop@ for (count1 in 1..10) {
        for (count2 in 1..5) {
            println("$count1, $count2")
            if(count1*count2==10) {
                break@loop
            }
        }
    }
}
cs


코틀린 중첩 반복문 - 라벨



앞서 보인 플래그를 사용하는 방법과 동일한 결과를 보인다. 이것을 라벨(Label)이라고 하는데, break만이 아니라 continue에도 이용할 수 있다.



abc@, fooBar@ 등의 방식으로 '라벨명@'로 라벨 정의

사용 시 @abc, @fooBar처럼 '@라벨명'으로 사용



따라서 위에 선보인 예제 소스에서는, count1을 제어하는 반복문에 loop라는 라벨이라 정의하고, count1*count2가 10이 되었는지 판단하는 if문에서 이 라벨이 표시된 반복문을 중단시키는 작동을 한 것이다.


코틀린에서는 이런 새로운 기능을 제공하니까 더 이상 플래그를 사용하지 말아야 겠다는 생각은 가져선 안 된다. 그저 이런 방법이 있다는 것을 이야기하는 것이지, 경우에 따라서는 플래그를 사용하는 것이 옳은 경우가 있기 때문에 적절하게 사용하는 것이 중요하다.


참고로 필자는, 작업이 모두 중단시키는 조건이라면 라벨을 사용하고, 그렇지 않고 여러 작업들이 조건에 따라 진행되는 경우에는 플래그를 사용한다.

728x90