[Chapter3-4] Rust 제어문 if, loop, while, for

hwwwa·2021년 10월 28일
0

🦀 Rust

목록 보기
7/25
post-thumbnail

if

fn main() {
    let number = 6;

    if number % 4 == 0 {
        println!("number is divisible by 4");
    } else if number % 3 == 0 {
        println!("number is divisible by 3");
    } else if number % 2 == 0 {
        println!("number is divisible by 2");
    } else {
        println!("number is not divisible by 4, 3, or 2");
    }
}

if 키워드로 시작하여 뒤이어 조건이 옵니다. 선택적으로 else ifelse 식을 포함시킬 수 있습니다. 위의 코드는 분기할 수 있는 네 개의 경로를 갖습니다. 너무 많은 else if식의 사용은 코드 이해를 어렵게 합니다. 이를 위해 후에 6장에 다룰 match 라는 강력한 분기 생성자를 사용합니다.

다른 예시를 알아봅시다.

fn main() {
    let number = 3;

    if number {
        println!("number was three");
    }
}위의 예시 코드는 에러가 발생하게 됩니다.

위의 예시 코드는 에러가 발생하게 됩니다.

error[E0308]: mismatched types
 --> src/main.rs:4:8
  |
4 |     if number {
  |        ^^^^^^ expected bool, found integral variable
  |
  = note: expected type `bool`
             found type `{integer}`

Rust가 Boolean 타입을 기대했으나 정수형이 왔다는 에러입니다. 다른 언어와 달리 Rust는 boolean 타입이 아닌 것을 boolean 타입으로 자동 변환하지 않습니다.

위의 코드를 숫자가 0이 아닐 시에 실행하고 싶다면, 아래와 같이 수정할 수 있습니다.

fn main() {
    let number = 3;

    if number != 0 {
        println!("number was something other than zero");
    }
}

let 구문에서 if 사용하기

if는 표현식이기 때문에 let 구문의 우측에 사용할 수 있습니다.

fn main() {
    let condition = true;
    let number = if condition {
        5
    } else {
        6
    };

    println!("The value of number is: {}", number);
}

위의 코드를 실행하면 number에는 if 식에서 산출된 5가 bound 됩니다.

다른 예시를 살펴봅시다.

fn main() {
    let condition = true;

    let number = if condition {
        5
    } else {
        "six"
    };

    println!("The value of number is: {}", number);
}
error[E0308]: if and else have incompatible types
 --> src/main.rs:4:18
  |
4 |       let number = if condition {
  |  __________________^
5 | |         5
6 | |     } else {
7 | |         "six"
8 | |     };
  | |_____^ expected integral variable, found reference
  |
  = note: expected type `{integer}`
             found type `&str`

위의 코드에서 에러가 발생한 이유는 if 블록이 정수형을 산출하고 else 블록은 문자열을 산출하기 때문입니다. 이런 경우가 성립하지 않는 이유는 변수가 가질 수 있는 타입이 오직 하나이기 때문입니다. Rust는 컴파일 시에 number 변수의 타입을 정확히 정의해야 합니다. Rust는 number의 타입을 실행 시에 정의되도록 할 수 없습니다.

반복문과 반복

loop : 코드의 반복 수행

fn main() {
    loop {
        println!("again!");
    }
}

위의 코드는 프로그램을 강제 정지하기 전까지 again! 이 반복 출력되는 것을 보게 됩니다. 대부분의 터미널은 단축키 ctrl+C를 통해 정지 가능합니다.

loop 에서는 코드에 break 키워드를 추가하여 루프를 멈출 수 있습니다.

while : 조건부 반복

fn main() {
    let mut number = 3;

    while number != 0 {
        println!("{}!", number);

        number = number - 1;
    }

    println!("LIFTOFF!!!");
}

for : 콜렉션 반복

fn main() {
    let a = [10, 20, 30, 40, 50];

    for element in a.iter() {
        println!("the value is: {}", element);
    }
}
$ cargo run
   Compiling loops v0.1.0 (file:///projects/loops)
    Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
     Running `target/debug/loops`
the value is: 10
the value is: 20
the value is: 30
the value is: 40
the value is: 50

for 반복문 사용을 위해 흔히 Rust에서 기본 라이브러리로 제공하는 Range를 함께 사용하게 됩니다. Range는 한 숫자에서 다른 숫자 전까지 모든 숫자를 차례로 생성합니다.

fn main() {
    for number in (1..4).rev() {
        println!("{}!", number);
    }
    println!("LIFTOFF!!!");
}
3!
2!
1!
LIFTOFF!!!

0개의 댓글