라벨이 붙은 while 반복문

라벨이 붙은 while 반복문 (Labeled while)

출처: Zig Documentation

본문

while 반복문에 라벨을 붙이면, 중첩된 반복문 안에서 breakcontinue가 그 라벨을 가리켜 겉쪽 반복문을 제어할 수 있어요.

보통 break는 자기 바로 바깥의 반복문만 빠져나가잖아요. 그런데 라벨을 쓰면 안쪽 루프에 있더라도 내가 원하는 특정 반복문을 정확히 겨냥해서 제어할 수 있게 돼요. 다음 코드를 볼게요.

test "nested break" {
    outer: while (true) {
        while (true) {
            break :outer;
        }
    }
}

test "nested continue" {
    var i: usize = 0;
    outer: while (i < 10) : (i += 1) {
        while (true) {
            continue :outer;
        }
    }
}

먼저 nested break 테스트를 볼게요. outer:라는 라벨이 붙은 while 안에 또 하나의 while (true)가 중첩돼 있죠. 안쪽 루프에서 break :outer;를 쓰면 안쪽 루프만 빠져나는 게 아니라, 라벨이 가리키는 outer 반복문까지 통째로 빠져나가요.

nested continue도 같은 논리예요. 라벨이 붙은 반복문은 보통 증가식을 함께 쓸 수 있어요. 여기서는 (i += 1)로 매 반복마다 i를 1씩 늘리고 있죠. 안쪽 루프에서 continue :outer;를 만나면, 안쪽 루프의 다음 반복으로 가는 대신 겉쪽 outer 반복문의 다음 반복(증가식 포함)으로 바로 이동해요. 그래서 안쪽 while (true)의 무한 루프에 빠지지 않고 i가 10에 도달할 때까지 반복을 이어가게 되는 거예요.

실제로 실행하면 두 테스트가 모두 통과하는 걸 확인할 수 있어요.

$ zig test test_while_nested_break.zig
1/2 test_while_nested_break.test.nested break...OK
2/2 test_while_nested_break.test.nested continue...OK
All 2 tests passed.

라벨의 문법만 정리하면 이래요. break :라벨이름;은 그 라벨의 반복문을 끝내고, continue :라벨이름;은 그 라벨의 반복문 다음 반복으로 건너뛰어요.

더 알아보기