본문 바로가기
Rust

Rust 설치부터 실행까지 (주석, 조건 반복문) - 7

by lms0806 2024. 12. 30.
728x90
반응형

오늘은 Rust의 주석과 조건 반복문에 대해 알아보고자 합니다.

주석

rust의 주석은 Python의 # 과 달리 C++, JAVA와 동일하게 // 으로 구성되어 있습니다.

제어 흐룸문

rust에서 실행 흐름을 제어하도록 해주는 일반적인 방법은 if표현식과 반복문 입니다.

if 표현식

rust에서의 if문은 다음과 같이 사용할 수 있습니다.

fn main() {
    let number = 3;

    if number < 5 {
        println!("condition was true");
    } else {
        println!("condition was false");
    }
}

rust는 c++과 다르게 if문의 타입이 bool이여야 합니다.

fn main() {
    let number = 3;

    if number {
        println!("number was three");
    }
}

다음과 같이 실행시, 에러가 발생합니다.

Compiling branches v0.1.0 (file:///projects/branches)
error[E0308]: mismatched types
 --> src/main.rs:4:8
  |
4 |     if number {
  |        ^^^^^^ expected `bool`, found integer
For more information about this error, try `rustc --explain E0308`.
error: could not compile `branches` due to previous error

해당 에러는 rust가 bool을 예상했으나, 정수형 타입의 값을 받았다는 것을 알려줍니다.

else if로 여러 조건식 다루기

rust에서 else if문은 python의 elif와 다르게 다음과 같이 작성할 수 있습니다.

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");
    }
}

let 구문에서 if 사용하기

rust에서 let변수에 if문으로 값을 주입하고자 할 경우 다음과 같이 할 수 있습니다.

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

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

타입을 지정해주지는 않았지만, number은 i32 타입을 가지게 됩니다.

만약, 다음과 같이 작성한 경우에는 어떻게 될까요?

fn main() {
    let condition = true;

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

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

number 변수는 ifelse에서 서로 다른 타입의 값을 가지게 설정함으로 인하여, 컴파일에러가 발생합니다.

   Compiling branches v0.1.0 (file:///projects/branches)
error[E0308]: `if` and `else` have incompatible types
 --> src/main.rs:4:44
  |
4 |     let number = if condition { 5 } else { "six" };
  |                                 -          ^^^^^ expected integer, found `&str`
  |                                 |
  |                                 expected because of this

For more information about this error, try `rustc --explain E0308`.
error: could not compile `branches` due to previous error

rust는 number변수의 타입이 무엇인지 확실히해야 합니다.

반복문을 이용한 반복

rust는 몇 가지 반복문을 제공합니다.

loop로 코드 반복하기

loop는 언제 그만두라고 명시적으로 알려주기 전까지, 영원히 코드 블록을 반복 수행합니다.

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

반복문에서 값 반환하기

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {result}");
}

해당 코드는 loop 반복문을 통해 counter가 10이 되는 경우 counter * 2를 result에 반환하도록 작성된 코드입니다.

 

루프 뒤에는 result에 값을 할당하는 구문을 끝내기 위해 세미콜론을 붙였습니다.

루트 라벨로 여러 반복문 사이에 모호함 없애기

fn main() {
    let mut count = 0;
    'counting_up: loop {
        println!("count = {count}");
        let mut remaining = 10;

        loop {
            println!("remaining = {remaining}");
            if remaining == 9 {
                break;
            }
            if count == 2 {
                break 'counting_up;
            }
            remaining -= 1;
        }

        count += 1;
    }
    println!("End count = {count}");
}

바깥쪽 루프문은 counting_up이라는 라벨이 있고, 라벨이 없는 안쪽 루프문에서는 count의 값이 2인 경우 counting_up을 반환하도록 되어 있습니다.

 

안쪽 루프문에서 count가 2가 되는 경우 counting_up을 반환하고, 이를 바깥쪽 루프문이 받아서 탈출하게 됩니다.

while을 이용한 조건 반복문

while문을 활용하여 반복문을 작성할 경우, loop, if, else 및 break를 사용하지 않고도 조건 반복문을 사용할 수 있습니다.

fn main() {
    let mut number = 3;

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

        number -= 1;
    }

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

for를 이용한 컬렉션에 대한 반복문

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

    while index < 5 {
        println!("the value is: {}", a[index]);

        index += 1;
    }
}

다음과 같은 while로 이루어진 반복문을 for문을 활용하여 다음과 같이 작성할 수 있습니다.

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

    for element in a {
        println!("the value is: {element}");
    }
}

for루프를 사용하면 배열 내 값의 개수를 변경시키더라도 수정해야 할 다른 코드를 기억해둘 필요가 없어진다.

 

이러한 안정성과 간편성 덕분에 for 반복문은 러스트에서 가장 흔하게 사용되는 반복문 구성요소가 되었습니다.

 

for반복문을 이용하여 카운트다운을 구현하면 다음과 같습니다.

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

여기서 rev메서드는 범위값을 역순으로 만들어준다.

정리

  1. rust의 조건반복문으로는 loop, while, for문이 있다.
  2. whilefor문은 다른 언어들과 동일하게 사용되고, loop는 반복문에 대한 결과를 반환하고자 while, for보다 효율적으로 사용할 수 있다.
728x90
반응형

댓글