Control Flow

이 포스트는 Rust를 처음 공부하면서 정리한 내용입니다. 해당 포스트는 개인적으로 기억하기 위한 메모 성격에 가깝습니다. “러스트 프로그래밍 공식 가이드 (2018, 제이펍)” 서적을 참고하였으며, 러스트 공식 사이트 에서 책과 동일한 내용을 찾을 수 있습니다. 따라서 더 자세한 내용을 찾으시면 위의 링크를 참고하시면 좋습니다.

흐름 제어는 많은 프로그래밍 언어에서 기본적인 프로그램 실행 분기를 처리하는데 사용됩니다. Rust에서도 마찬가지로 흐름 제어를 지원하고 있고 형태는 비슷하기 때문에 기본적인 사용 예제와 주의점만 작성하도록 하겠습니다.

if

예제 1: if 기본 사용 법

기본적인 if 사용법은 다른 많은 프로그래밍 언어가 채택한 방식과 동일합니다.

fn main() {
    let number = 3;

    // 기본적인 if-else
    if number < 5 {
        println!("condition was true");
    } else {
        println!("condition was false");
    }

    // 조건이 한 개인 if
    if number != 0 {
        println!("number was something other than zero");
    }

    // 여러 개의 분기 if-else if-else
    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");
    }
}

Rust에서 if 사용 시 주의할 사항은 아래와 같습니다.

  • if 문의 조건은 반드시 불리언 타입 중 하나를 리턴해야 합니다. C가 0이 아닌 값은 참으로 처리하는 것과 다르게 Rust에서는 불리언 타입이 아닌 값이 평가되는 경우 오류를 뱉습니다.
  • else if 사용 시 처음 일치하는 표현시의 본문만 처리합니다.

예제 2: let 구문에서 if 사용

if 는 표현식입니다. 따라서 let 구문 오른쪽에 사용할 수 있습니다. 아래의 예제에서 condition에 따라 number에 할당되는 값이 달라집니다.

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

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

여기서 주의할 점은 분기에 따라 리턴하는 값이 동일해야 합니다. 만일 아래와 같은 예제처럼 타입이 일치하지 않는 경우 에러가 발생합니다.

fn main() {
    let condition = true;

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

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

loop

Rust는 loop, while, for 세 가지 종류의 루프를 제공합니다. 이 중 loop는 중지하라고 명시적으로 설정하지 않는 한 코드 블록을 무한으로 반복 실행합니다.

예제 1: 무한 반복

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

Rust에서 루프를 탈출하기 위한 키워드는 break입니다.

예제 2: 루프에서 값 리턴

루프를 이용하는 방법 중 하나는 스레드가 작업을 완료했는지 여부를 확인하는 등 실패할 가능성이 있는 작업을 재시도하는 경우입니다. 그러나 작업의 결과를 다른 코드에 전달해야 할 수도 있습니다. 이 때 루프를 중단하는 break 표현식 다음에 리턴하고자 하는 값을 추가하면 됩니다.

아래와 같은 옞에서는 루프 외부로 리턴되어 나머지 코드에서 사용할 수 있습니다.

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2; // Return!
        }
    };

    assert_eq!(result, 20);
}

while

while은 조건식의 평가 결과에 따라 반복문을 실행합니다.

fn main() {
    let mut number = 3;

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

        number = number - 1;
    }

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

for

for를 사용하면 비교적 쉽게 컬렉션을 반복 처리할 수 있습니다.

fn main() {
    let mut number = 3;

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

        number = number - 1;
    }

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

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


태그:

카테고리:

업데이트: