“데이터는 이야기, 제어 흐름은 그 이야기의 길잡이”입니다. Rust에서는 Rust if / Rust else 조건문, Rust loop·Rust while·Rust for 반복문, 그리고 강력한 Rust match 패턴 매칭으로 코드의 흐름을 유연하게 조종할 수 있습니다. 이번 장을 통해 세 도구를 확실히 다지며, 이후 실전 로직 구현의 밑바탕을 만들어 봅시다!
4-1. if / else
조건문
① 기본 형태
Rust if
는 조건 뒤에 ()
가 필요 없고 값이 표현식(expression)으로 취급됩니다. 모든 분기에서 같은 타입을 반환해야 함에 유의하세요.
let temperature = 28;
if temperature >= 30 {
println!("너무 더워요!");
} else if temperature >= 20 {
println!("딱 좋아요!");
} else {
println!("조금 쌀쌀하네요.");
}
② if를 값으로 사용하기
let num = 5;
let parity = if num % 2 == 0 { "짝수" } else { "홀수" };
println!("{num}은 {parity}입니다.");
if
전체가 값이므로 parity
변수에 문자열이 들어갑니다.
4-2. 반복문: loop
, while
, for
① 무한 루프 loop
loop
는 탈출 조건 없이 무한 반복합니다. break
로 빠져나오거나 continue
로 다음 반복으로 건너뛰죠.
let mut counter = 0;
loop {
counter += 1;
if counter == 3 {
println!("세 번째!");
continue;
}
if counter == 5 { break; } // 5에서 탈출
}
② 조건 루프 while
let mut n = 5;
while n > 0 {
println!("{n}!");
n -= 1;
}
조건이 거짓이 되면 루프가 끝납니다.
③ 컬렉션 순회 for
for x in 1..=5 { // 1부터 5까지 포함(range)
print!("{x} ");
}
for
는 이터레이터를 순회하므로 배열·벡터와도 찰떡궁합입니다.
4-3. 패턴 매칭: match
의 활용
① enum 값 분기
enum TrafficLight { Red, Yellow, Green }
fn action(light: TrafficLight) {
match light {
TrafficLight::Red => println!("STOP!"),
TrafficLight::Yellow => println!("Ready..."),
TrafficLight::Green => println!("GO!"),
}
}
match
는 C 계열의 switch
보다 강력하며, 모든 경우를 반드시 소진해야 컴파일이 통과됩니다.
② 패턴 + 가드 조건
let v = 4;
match v {
1 | 3 | 5 if v < 4 => println!("작은 홀수"),
1 | 3 | 5 => println!("큰 홀수"),
2 | 4 | 6 => println!("짝수"),
_ => println!("기타"),
}
‘패턴 | 패턴 if 조건’ 구문을 통해 세밀한 분기가 가능합니다.
③ if let
, let else
로 간결하게
if let
은 특정 패턴만 처리하고 나머지를 무시할 때 사용합니다.
let maybe = Some(7);
if let Some(n) = maybe {
println!("숫자는 {n}");
}
4-4. 종합 실습: 간이 ATM 시뮬레이터
fn main() {
let mut balance: i32 = 30_000; // 잔액
let menu = ["입금", "출금", "잔액 확인", "종료"];
for (idx, item) in menu.iter().enumerate() {
println!("{idx}. {item}");
}
// 임의 입력
let choice = 1;
match choice {
0 => { balance += 10_000; println!("입금 완료"); }
1 => {
let amount = 5_000;
if amount <= balance { // Rust if 예시
balance -= amount;
println!("출금 완료");
} else {
println!("잔액 부족");
}
}
2 => println!("현재 잔액: {balance}"),
3 => { println!("종료"); return; }
_ => println!("잘못된 선택"),
}
}
위 코드는 Rust if, Rust loop(for
), Rust match를 모두 활용해 간단한 ATM 메뉴를 구현합니다. 각 분기마다 타입 안전성이 보장되므로, 논리 실수보다 먼저 컴파일러가 오류 가능성을 잡아 줍니다.
4-5. 오늘 배운 핵심 요약
- Rust if / Rust else는 표현식이며 모든 분기 타입 일치를 요구
- Rust loop·Rust while·Rust for로 무한·조건·이터레이터 순회 완전 정복
- Rust match로 패턴 매칭 + 가드 조건 + 열거형 처리
if let
·let else
로 선택적 패턴을 간결히 표현
제어 흐름의 기초를 다졌으니 다음 장에서는 소유권과 빌림 심화로 메모리 안전성을 직접 체험해 봅시다!
'08.개발&프로그래밍 > 4.Rust(러스트)' 카테고리의 다른 글
6장: 함수와 모듈로 코드 구조화하기 (0) | 2025.07.28 |
---|---|
5장: 소유권(Ownership)과 빌림(Borrowing) (0) | 2025.07.28 |
3장: Rust 기초 문법 이해하기 (0) | 2025.07.28 |
2장: Rust 개발 환경 준비하기 (0) | 2025.07.28 |
1장. Rust 입문: 메모리 안전성과 성능을 한 번에 잡는 첫걸음 (0) | 2025.07.28 |