Java에서 중첩 루프 한번에 탈출 하는법

Posted by epicdev Archive : 2012. 1. 26. 22:22
중첩 루프를 돌면서 어떠한 조건이 만족하면 탈출하는식의 코드를 자주 코딩을 하게 된다.
이런 유형은 대개 아래와 같다.

1
2
3
4
5
6
7
8
9
for(...) {
    for(...) {
        for(...) {
            if(condition) {
                //break out of all loops
            }
        }
    }
}
일반적으로 이런 경우에는 아래와 같은 방법으로 코딩을 하게 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
boolean found = false;
for(...) {
    for(...) {
        for(...) {
            if(condition) {
                found = true;
                break;
            }
        }
        if(found) break;
    }
    if(found) break;
}
혹은 중첩 루프를 함수로 만들어서 if 절 안의 break를 return으로 바꿔서 한번에 루프를 탈출하는 방법을 쓰기도 한다.
C++의 경우 goto를 사용하면 더 간단하게 이 문제를 해결할 수 있다.
물론 goto는 무조건 사용하지말라고 배웠다면 이러한 방법이 꺼려지겠지만,
거의 유일하게 goto를 써도 욕을 먹지 않는 경우가 바로 아래의 경우이다.
flag에 대한 설명을 주저리 주저리 할 필요도 없고, 코드의 가독성 또한 훨씬 높아진다.
1
2
3
4
5
6
7
8
9
10
for(...) {
    for(...) {
        for(...) {
            if(condition) {
                goto loop;
            }
        }
    }
}
loop:
하지만 Java에서는 goto문이 없다. 즉, C++에서처럼 goto를 사용해서 중첩 루프를 탈출 할 수 없다는 것이다.
하지만 Java에서는 이와 비슷한 다른 문법적 장치가 있다.
1
2
3
4
5
6
7
8
9
10
loop:
for(...) {
    for(...) {
        for(...) {
            if(condition) {
                break loop;
            }
        }
    }
}
Java에서는 위와 같이 코딩을 하면 중첩 루프를 한번에 탈출할 수 있다.
왜 이런지 이해가 되지 않는다면 아래처럼 named block을 사용했다고 생각하면 된다.
1
2
3
4
5
6
7
8
9
10
11
loop: {
    for(...) {
        for(...) {
            for(...) {
                if(condition) {
                    break loop;
                }
            }
        }
    }
}
혹은
1
2
3
4
5
6
7
8
9
loop: for(...) {
    for(...) {
        for(...) {
            if(condition) {
                break loop;
            }
        }
    }
}