Rust break와 continue
break와 continue를 쓰면 반복문을 끝까지 돌리지 않고 중간에 끊을 수 있어요. loop, while, for 세 가지 반복문 모두에서 똑같이 동작해요.
break: 반복문을 완전히 빠져나가기
섹션 제목: “break: 반복문을 완전히 빠져나가기”break는 반복문을 즉시 멈추고, 실행은 반복문 바로 다음 코드로 넘어가요.
fn main() { for i in 1..=10 { if i == 5 { break; } println!("{i}"); }}실행 결과:
1234범위는 10까지지만, i가 5가 되는 순간 반복문이 멈춰요.
continue: 다음 차례로 건너뛰기
섹션 제목: “continue: 다음 차례로 건너뛰기”continue는 반복문을 완전히 멈추는 대신, 이번 차례의 남은 부분을 건너뛰고 바로 다음 차례로 넘어가요.
fn main() { for i in 1..=10 { if i % 2 == 0 { continue; // 짝수는 건너뛰어요 } println!("{i}"); }}실행 결과:
13579짝수는 모두 건너뛰어요. continue가 실행되면 println!을 실행하지 않고 곧바로 다음 i 값으로 넘어가요.
루프 라벨
섹션 제목: “루프 라벨”반복문 안에 다른 반복문을 넣으면(중첩하면), 그냥 쓰는 break/continue는 가장 안쪽 반복문에만 영향을 줘요. 안쪽 반복문에서 바깥 반복문을 빠져나가고 싶다면, 바깥 반복문에 라벨을 붙이세요('이름: 형태로 써요).
fn main() { 'outer: for x in 1..=3 { for y in 1..=3 { if x * y > 4 { break 'outer; } println!("{x} x {y} = {}", x * y); } }}실행 결과:
1 x 1 = 11 x 2 = 21 x 3 = 32 x 1 = 22 x 2 = 4라벨이 없으면 break는 안쪽의 y 반복문만 멈추고, x 반복문은 계속 돌아요. break 'outer;는 두 반복문을 한꺼번에 멈춰요. continue 'outer;도 같은 방식으로 동작해요. 완전히 멈추는 대신 바깥 반복문의 다음 차례로 건너뛰고 싶을 때 쓰면 돼요.
while 반복문의 continue 함정
섹션 제목: “while 반복문의 continue 함정”for 반복문에서는 다음 값이 범위에서 자동으로 나오기 때문에 continue를 써도 언제나 안전해요. while 반복문은 달라요. 카운터를 갱신하는 건 여러분의 몫이고, 보통 본문 맨 아래에서 갱신하죠. continue가 그 갱신 코드를 건너뛰어 버리면 카운터가 바뀌지 않아서 반복문이 영원히 돌아요.
아래 코드는 3을 건너뛰려고 하지만 멈추지 않아요. 실행하지 마세요.
fn main() { let mut i = 0; while i < 5 { if i == 3 { continue; // ❌ i를 바꾸지 않은 채로 위로 돌아가요 } println!("{i}"); i += 1; }}i가 3이 되면 continue가 조건 검사로 돌아가요. i는 여전히 3이니까 continue가 또 실행되고, 또 실행되고, 영원히 반복돼요. 해결책은 continue가 실행될 수 있는 코드보다 먼저 카운터를 갱신하는 거예요.
fn main() { let mut i = 0; while i < 5 { i += 1; // 먼저 갱신해서 continue가 건너뛸 수 없게 해요 if i == 3 { continue; } println!("{i}"); }}실행 결과:
1245i += 1을 맨 위로 옮기면 숫자가 하나씩 밀려요. 이 반복문은 0부터 4가 아니라 1부터 5를 출력해요. 원래 범위가 필요하다면 시작값이나 조건을 조정하세요. 그냥 숫자를 세는 거라면 범위를 도는 for 반복문을 쓰는 게 더 좋아요. 그러면 이 문제가 아예 생길 수 없어요.
연습 문제
섹션 제목: “연습 문제”1. 3의 배수 건너뛰기
섹션 제목: “1. 3의 배수 건너뛰기”1부터 10까지 출력하되, 3의 배수는 모두 건너뛰세요. 힌트: n % 3 == 0이면 3의 배수예요. continue로 건너뛰세요.
정답 보기
fn main() { for n in 1..=10 { if n % 3 == 0 { continue; } println!("{n}"); }}실행 결과:
124578102. 곱해서 24가 되는 쌍 찾기
섹션 제목: “2. 곱해서 24가 되는 쌍 찾기”x와 y 두 개의 for 반복문을 중첩하고, 둘 다 1..=9를 돌게 하세요. x * y == 24가 되는 첫 번째 쌍을 찾아 출력하고 두 반복문을 모두 멈추세요. 힌트: 바깥 반복문에 라벨을 붙이고 break 'outer;를 쓰세요.
정답 보기
fn main() { 'outer: for x in 1..=9 { for y in 1..=9 { if x * y == 24 { println!("찾았어요: {x} x {y} = 24"); break 'outer; } } } println!("검색 끝");}실행 결과:
찾았어요: 3 x 8 = 24검색 끝break 'outer;를 그냥 break;로 바꿔 보세요. 이제 안쪽 반복문만 멈추기 때문에 검색이 계속되고, 4 x 6, 6 x 4, 8 x 3도 출력돼요.
break는 반복문을 즉시 빠져나가요.continue는 이번 반복의 남은 부분을 건너뛰고 다음 반복으로 넘어가요.- 라벨(
'outer:)을 붙이면 중첩된 반복문 안에서break/continue로 바깥 반복문을 제어할 수 있어요. while반복문에서는continue보다 먼저 카운터를 갱신하세요. 그렇지 않으면 반복문이 영원히 멈추지 않을 수 있어요.
이해도 점검
섹션 제목: “이해도 점검”이해도 점검
1. 반복문 안에서 continue는 무슨 일을 할까요?
2. 중첩된 반복문에서 break로 가리킬 수 있도록 반복문에 라벨을 붙이려면 어떻게 쓸까요?
3. continue가 들어 있는 while 반복문이 끝나지 않아요. 가장 그럴듯한 원인은 무엇일까요?
점수: 0 / 3
더 알아보기
섹션 제목: “더 알아보기”- 루프 라벨로 여러 반복문 사이에 모호함 없애기 — The Rust Programming Language 한국어판: 중첩된 카운트다운 예제로 라벨을 소개하는 공식 입문서예요.
- Nesting and labels — Rust by Example (영어):
break 'outer와continue 'outer를 보여 주는 짧은 예제를 실행해 볼 수 있어요. - Loop Labels — The Rust Reference (영어): 라벨을 어디에 쓸 수 있는지에 대한 정확한 규칙이에요.
breakexpressions — The Rust Reference (영어): 값을 돌려주는break를 포함해서break가 어떻게 동작하는지 설명해요.continueexpressions — The Rust Reference (영어): 반복문 종류마다continue가 무슨 일을 하는지 설명해요.