본문 바로가기
08.개발&프로그래밍/4.Rust(러스트)

4장: 제어 흐름 다지기

by JWJ Family 2025. 7. 28.
728x90

데이터는 이야기, 제어 흐름은 그 이야기의 길잡이”입니다. 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로 선택적 패턴을 간결히 표현

제어 흐름의 기초를 다졌으니 다음 장에서는 소유권과 빌림 심화로 메모리 안전성을 직접 체험해 봅시다!

반응형