Rust loop 반복문
Rust에는 코드를 반복하는 방법이 세 가지 있어요. loop, while, 그리고 for예요. 이 페이지에서는 셋 중 가장 단순하고 직접적인 loop를 다뤄요. loop는 멈추라고 할 때까지 영원히 반복해요.
기본 loop
섹션 제목: “기본 loop”fn main() { let mut count = 0;
loop { count += 1; println!("{count}");
if count == 3 { break; } }}실행 결과:
123loop는 그 자체로는 절대 멈추지 않아요. 반복을 끝내는 건 break예요. if count == 3 { break; }가 없으면 이 프로그램은 영원히 출력을 계속해요.
loop에서 값 반환하기
섹션 제목: “loop에서 값 반환하기”while과 for는 못 하지만 loop는 할 수 있는 일이 있어요. break 뒤에 값을 쓰면, 그 값이 반복문 전체의 결과가 돼요.
fn main() { let mut count = 0;
let result = loop { count += 1; if count == 10 { break count * 2; // 멈추면서 값을 돌려줘요 } };
println!("{result}");}실행 결과:
20“성공할 때까지 계속 다시 시도하고, 성공하면 결과를 줘” 같은 상황에 딱 좋아요. 실제 코드에서 생각보다 자주 보게 되는 패턴이에요.
반복문을 닫는 } 뒤의 세미콜론을 눈여겨보세요. loop { ... } 전체가 let result = ...;의 오른쪽에 오기 때문에, let x = 5;처럼 let 문 끝에 ;가 필요해요.
왜 while true가 아니라 loop일까요?
섹션 제목: “왜 while true가 아니라 loop일까요?”다른 언어를 쓰다 왔다면 무한 반복을 while true { ... }로 쓰고 싶을 수도 있어요. Rust에서도 동작은 하지만, 컴파일러가 경고를 해요.
warning: denote infinite loops with `loop { ... }` --> src/main.rs:5:5 |5 | while true { | ^^^^^^^^^^ help: use `loop`“무한 반복은 loop { ... }로 표현하세요”라는 뜻이에요. 이건 단순히 스타일 문제가 아니에요. Rust는 loop의 본문이 항상 실행된다는 것과, 빠져나갈 유일한 방법이 break라는 것을 알아요. 하지만 while true는 조건의 값을 들여다보지 않기 때문에 그렇게 가정하지 않아요. 변수가 반복문 안에서 값을 받을 때 이 차이가 실제로 드러나요.
fn main() { let mut n = 1; let answer; // 아직 값이 없어요
loop { if n * n > 50 { answer = n * n; // 빠져나가기 직전에 값을 넣어요 break; } n += 1; }
println!("50보다 큰 첫 번째 제곱수: {answer}");}실행 결과:
50보다 큰 첫 번째 제곱수: 64loop를 쓰면 Rust는 println!에 도달하는 길이 그 break를 거치는 것뿐이라는 걸 알 수 있어요. 그래서 answer에는 항상 값이 들어 있어요. loop를 while true로 바꾸면 error[E0381]: used binding answer is possibly-uninitialized라는 에러가 나요. 초기화되지 않았을 수도 있는 변수를 썼다는 뜻이에요. 컴파일러는 if를 한 번도 실행하지 않고 반복문이 끝날 수도 있다고 생각하는 거예요.
실제로는 위에서 본 값을 돌려주는 break를 쓰는 게 이 프로그램의 가장 깔끔한 버전이에요: let answer = loop { ... break n * n; ... };. 어느 쪽이든 교훈은 같아요. “멈추라고 할 때까지 영원히”라는 뜻이라면 loop라고 쓰세요.
loop는 언제 쓸까요
섹션 제목: “loop는 언제 쓸까요”몇 번 반복할지 미리 알 수 없을 때는 loop가 알맞아요. 범위나 목록을 하나씩 세는 게 아니라, 어떤 조건이 참이 되기를 기다리는 경우예요. 숫자를 세거나 컬렉션을 순회할 때는 다음에 배울 while과 for가 보통 더 읽기 좋아요.
연습 문제
섹션 제목: “연습 문제”1. 발사 카운트다운
섹션 제목: “1. 발사 카운트다운”loop로 5부터 1까지 카운트다운을 출력하고, 그다음 발사!를 출력하세요. 힌트: let mut n = 5;로 시작하고, n이 0이 되면 break하세요.
정답 보기
fn main() { let mut n = 5;
loop { if n == 0 { break; } println!("{n}..."); n -= 1; }
println!("발사!");}실행 결과:
5...4...3...2...1...발사!확인을 먼저 하기 때문에, n이 0이 되면 0...을 출력하기 전에 반복이 멈춰요.
2. 1000보다 큰 첫 번째 2의 거듭제곱
섹션 제목: “2. 1000보다 큰 첫 번째 2의 거듭제곱”1에서 시작해서 계속 두 배로 만들어 보세요. 값을 돌려주는 break로 1000보다 큰 첫 번째 숫자를 구하고, 두 배를 몇 번 했는지도 세어 보세요. 힌트: mut 카운터는 반복문 바깥에 두고, let power = loop { ... };처럼 쓰세요.
정답 보기
fn main() { let mut value = 1; let mut doublings = 0;
let power = loop { value *= 2; doublings += 1; if value > 1000 { break value; } };
println!("두 배를 {doublings}번 해서 {power}");}실행 결과:
두 배를 10번 해서 1024break value;는 반복을 끝내면서 value를 power에 넘겨줘요. 카운터는 반복문 바깥에 있으니, 반복이 끝난 뒤에도 값이 그대로 남아 있어요.
loop는break가 멈출 때까지 영원히 반복해요.break가 꼭 있는지 확인하세요.break 값;은 반복을 멈추고, 동시에값을 반복문 식 전체의 결과로 돌려줘요.while true가 아니라loop라고 쓰세요. Rust는loop본문이 항상 실행된다는 걸 알아서, 변수 검사에 도움이 돼요.- 정해진 횟수를 셀 때가 아니라 “어떤 조건이 일어날 때까지” 반복할 때
loop를 쓰세요.
이해도 점검
섹션 제목: “이해도 점검”이해도 점검
1. 그냥 loop만 쓴 반복문이 영원히 돌지 않게 멈추는 것은 무엇인가요?
2. 반복문 안에서 break count * 2;라고 쓰면 어떻게 되나요?
3. 이 페이지에 따르면, while이나 for보다 loop가 더 나은 때는 언제인가요?
4. Rust에서 while true { ... }라고 쓰면 어떻게 되나요?
점수: 0 / 4
더 알아보기
섹션 제목: “더 알아보기”- 반복문을 이용한 반복 - The Rust Programming Language 한국어판:
loop,while,for를 소개하는 공식 문서예요. - 반복문에서 값 반환하기 - The Rust Programming Language 한국어판: 값을 돌려주는
break를 다루는 짧은 절이에요. - loop - Rust by Example (영어):
loop,break,continue를 실행해 볼 수 있는 예제예요. - Returning from loops - Rust by Example (영어): 값을 돌려주는 반복문의 작은 예제가 하나 더 있어요.
loop키워드 - 표준 라이브러리 문서 (영어):loop와break가 함께 동작하는 방식을 간단히 정리한 레퍼런스예요.