04. 제어 흐름 (if·loop·while·for·break value)
Rust 의 if 는 표현식입니다. let x = if cond { 1 } else { 2 } 처럼 값을 만들 수 있습니다. loop / while / for 의 차이, 그리고 Rust 특유의 break 에 값 붙이기, 라벨 붙은 break/continue, 그리고 range 와 iterator 의 for 루프 동작까지 한 번에 다룹니다.
이 강의에서 배우는 것
- 1if 가 표현식임을 이해하고 값으로 사용한다
- 2loop / while / for 의 적절한 쓰임을 구분한다
- 3break 에 값을 붙여 loop 의 결과로 반환한다
- 4라벨로 중첩 루프를 정확히 빠져나간다
- 5range(`0..10`, `0..=10`) 와 iterator 의 for 루프를 사용한다
소개
Rust 에는 삼항 연산자 `cond ? a : b` 가 없습니다. 대신 if 자체가 값을 만드는 표현식이라 자연스럽게 같은 표현이 가능합니다. 이런 일관성이 코드를 짧고 읽기 쉽게 만들어 줍니다.
핵심 개념
1) if 는 표현식
let n = 10;
let kind = if n % 2 == 0 { "짝수" } else { "홀수" };
println!("{}", kind); // 짝수각 분기의 타입이 같아야 합니다. 한 쪽이 "짝" 다른 쪽이 42 면 컴파일 에러.
2) loop — 무조건 반복, break 로 빠져나옴
- 조건이 없는 무한 루프
- break 에 값을 붙이면 loop 의 평가값이 됨
- 라벨(`'outer:`) 로 중첩 루프 제어
3) while — 조건이 true 인 동안
조건이 처음부터 false 면 한 번도 실행 안 됨. 인덱스 기반 순회보단 for 가 자주 쓰입니다.
4) for — iterator 순회
- `for x in 0..10` — 0,1,...,9 (배타적 우측)
- `for x in 0..=10` — 0,1,...,10 (포괄)
- `for x in &v` — Vec 등 iterator 순회
핵심 예제
break 에 값을 붙이는 패턴 — 검색에 유용:
fn main() {
let arr = [3, 7, 11, 13, 17];
let target = 11;
let idx = loop {
let mut i = 0;
while i < arr.len() {
if arr[i] == target { break i as i32; }
i += 1;
}
break -1;
};
println!("index = {}", idx); // 2
}라벨로 중첩 루프 빠져나가기:
fn main() {
'outer: for i in 0..5 {
for j in 0..5 {
if i + j == 6 {
println!("found ({}, {})", i, j);
break 'outer;
}
}
}
}for 와 range/iterator:
fn main() {
for i in 0..3 { println!("i={}", i); } // 0,1,2
for i in 1..=3 { println!("j={}", i); } // 1,2,3
let v = vec![10, 20, 30];
for x in &v { println!("x={}", x); }
for (idx, x) in v.iter().enumerate() {
println!("{}-{}", idx, x);
}
}자주 하는 실수
Q. for i = 0; i < n; i++ 같은 C 스타일 for 는?
A. Rust 에는 없습니다. `for i in 0..n` 으로 충분하고, 인덱스를 같이 쓰려면 `.iter().enumerate()`. 더 표현력 있고 off-by-one 실수가 줄어듭니다.
Q. if 의 분기 타입이 다르면 어떻게 되나요?
A. 컴파일 에러. let x = if cond { 1 } else { "two" } 는 안 됩니다. 같은 타입으로 맞추거나, 둘 다 어떤 enum 안에 감싸야 합니다.
Q. while let 은 뭔가요?
A. 패턴 매칭이 가능한 while. `while let Some(v) = iter.next() { ... }` 처럼 Option 이 Some 인 동안 반복. 패턴 매칭 강의에서 자세히.
정리
- if 는 표현식 → let 의 우변으로 사용 가능
- loop 는 무한, break 로 값 반환 가능
- for in range / for in iterator 가 가장 자주 쓰이는 형태
- 중첩 루프는 라벨로 정확히 빠져나간다
과제
- 1 부터 100 까지 짝수만 더한 값을 for 와 if 로 구해 출력
- loop + break with value 패턴으로 sqrt(2) 의 근사값을 뉴턴법으로 5회 반복 계산
- 2차원 좌표 (i, j) 에서 i + j 가 처음으로 7이 되는 지점을 라벨 break 로 찾기