DaleSchool

조건문과 반복문

입문20분

학습 목표

  • if/else로 조건에 따라 다른 코드를 실행할 수 있다
  • loop으로 무한 반복을 만들고 break로 빠져나올 수 있다
  • for 반복문으로 범위나 컬렉션을 순회할 수 있다
  • if를 표현식으로 사용하여 변수에 값을 할당할 수 있다

동작하는 코드

아래 코드를 Rust Playground에서 실행해보세요!

fn main() {
    let temperature = 30;

    if temperature >= 30 {
        println!("더워요! 아이스커피 마시러 가요 ☕");
    } else if temperature >= 20 {
        println!("딱 좋은 날씨예요!");
    } else {
        println!("따뜻하게 입으세요!");
    }

    // 1부터 5까지 출력
    for i in 1..=5 {
        println!("{i}번째 반복!");
    }
}

if 뒤에 조건을 쓰고, 조건이 맞으면 {} 안의 코드가 실행돼요. C나 Java와 달리 괄호를 쓰지 않아도 돼요.

for는 범위(range)를 순회해요. 1..=5는 1부터 5까지, 1..5는 1부터 4까지예요.

직접 수정하기

  1. temperature 값을 15로 바꿔보세요. 어떤 메시지가 나오나요?
  2. 1..=50..3으로 바꿔보세요. 몇 번 반복되나요?

"왜?" — if는 값을 만들 수 있어요

Rust의 if는 다른 언어와 다른 점이 있어요. 값을 반환하는 표현식(expression) 이에요!

fn main() {
    let score = 85;
    let grade = if score >= 90 {
        "A"
    } else if score >= 80 {
        "B"
    } else {
        "C"
    };

    println!("점수: {score}, 등급: {grade}");
}

신기하죠? if의 결과를 바로 변수에 넣을 수 있어요. 이때 각 분기의 마지막 값이 반환값이 돼요. 세미콜론(;)을 붙이지 않는 게 포인트예요 — 함수에서 값을 반환할 때와 같은 규칙이에요.

Rust에는 세 가지 반복문이 있어요.

| 반복문 | 언제 쓸까요? | | ------- | -------------------------------------- | | for | 횟수가 정해져 있을 때 (가장 자주 사용) | | while | 조건이 참인 동안 반복할 때 | | loop | 무한 반복 + break로 빠져나올 때 |

fn main() {
    // while: 조건이 참인 동안 반복
    let mut count = 3;
    while count > 0 {
        println!("{count}!");
        count -= 1;
    }
    println!("발사!");

    // loop: 무한 반복 + break
    let mut sum = 0;
    loop {
        sum += 1;
        if sum >= 10 {
            break;
        }
    }
    println!("합계: {sum}");
}

심화 학습

while과 loop, 뭐가 다른가요?

while은 조건을 먼저 검사하고 반복해요. loop은 일단 무조건 실행하고 break로 빠져나와요.

loop만의 특별한 능력이 있어요 — break에 값을 붙여서 반환할 수 있어요!

fn main() {
    let mut counter = 0;
    let result = loop {
        counter += 1;
        if counter == 5 {
            break counter * 10; // 50을 반환
        }
    };
    println!("결과: {result}");
}

forwhile로는 이렇게 할 수 없어요. 반복을 돌면서 어떤 값을 찾아야 할 때 loop이 유용해요.

continue — 건너뛰기

break가 반복을 완전히 멈추는 거라면, continue는 현재 반복만 건너뛰고 다음으로 넘어가요.

fn main() {
    for i in 1..=10 {
        if i % 3 == 0 {
            continue; // 3의 배수는 건너뛰기
        }
        println!("{i}");
    }
}

실행하면 3, 6, 9가 빠진 채로 출력돼요.

if를 표현식으로 쓸 때 주의할 점이 있어요. 각 분기의 타입이 같아야 해요.

fn main() {
    let value = if true {
        5
    } else {
        "안녕" // 에러! i32와 &str 타입이 다름
    };
}

에러 메시지:

error[E0308]: `if` and `else` have incompatible types
 --> src/main.rs:4:9
  |
2 |       let value = if true {
  |  _________________-
3 | |         5
  | |         - expected because of this
4 | |     } else {
5 | |         "안녕"
  | |         ^^^^^^ expected integer, found `&str`

해석: "ifelse의 타입이 맞지 않아요"라는 뜻이에요. 한쪽은 숫자, 한쪽은 문자열이면 Rust가 무슨 타입으로 저장해야 할지 모르겠죠? 같은 타입으로 맞춰주면 해결돼요.

  1. 1부터 100까지의 숫자 중에서 FizzBuzz를 만들어보세요.
    • 3의 배수이면 "Fizz" 출력
    • 5의 배수이면 "Buzz" 출력
    • 3과 5의 공배수이면 "FizzBuzz" 출력
    • 그 외에는 숫자 출력
    • 힌트: % 연산자로 나머지를 구하고, 공배수 조건을 먼저 검사하세요!
  2. 2단부터 9단까지의 구구단을 for 중첩으로 출력해보세요. (for dan in 2..=9 { for i in 1..=9 { ... } })

Q1. 아래 코드의 실행 결과는 무엇일까요?

fn main() {
    let x = 7;
    let label = if x % 2 == 0 { "짝수" } else { "홀수" };
    println!("{label}");
}
  • A) 짝수
  • B) 홀수
  • C) 컴파일 에러
  • D) 아무것도 출력되지 않는다

Q2. for i in 0..5는 몇 번 반복할까요?

  • A) 4번
  • B) 5번
  • C) 6번
  • D) 무한

Q3. loop 안에서 반복을 멈추려면 어떤 키워드를 사용할까요?

  • A) stop
  • B) exit
  • C) break
  • D) return