본문 바로가기

Rust

조건, 반복문

C/C++, Java, python과 같은 언어들의 기본적인 조건식, 반복문과 다른 점만 작성한다.

 

조건식

기본적인 if , else if , else 구조를 사용한다.

rust의 조건식에는 무조건 bool 타입만이 가능하다.

let number = 3;

if number > 3 {
}

if number { //error
}

 

rust에서의 if ,else if, else 의 조건식은 expression이다.

이는 let 의 우변에 존재 가능함을 의미한다.

{} 의 내부 값은 결과값이기에 ; 이 붙으면 무조건 () 을 x에 바인딩함에 유의해야 한다.

그리고 바인딩을 하든 안하든 모든 {} 블록 내부의 결과값에 대한 타입은 동일해야한다. 

let flag = true;
let x = if flag {5} else {6};

 

 

 

반복문

rust의 반복문에는 loop, while, for 가 있다.

 

loop 의 경우 condition 없이 {} 블록을 무한 반복한다.

이는 기저조건을 설정하여 내부적으로 break를 사용해 종료해야한다.

여기서 나는 의문점이 생겼다.

break를 이용한 loop 탈출은 다음과 같다.

loop {} 블록 또한 표현식이기에 바인딩 가능함에 유의하자.

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

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

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

 

위의 코드를 보면 break 뒤에 ; 을 붙이는 것을 볼 수 있다.

나는 여기서 의문점이 생겼다. 표현식의 종료에는 ; 이 안붙는 것이 아니었나?

이에 대하여 찾아본 결과 rust에는 never type 이란게 존재함을 알게 되었다.

 

이 never type은 ! 타입이라고도 표현하는데 어떤 타입과도 호환되는 호환성을 가진 타입이다.

아래는 사용 예시 코드이다.

let x = 0;
loop{
    let x: i32 = if false {
        10      // i32 타입
    } else {
        break  // ! (Never) 타입, {} 블록의 마지막이므로 ; 생략 가능
    };
}

 

rust의 타입체크는 컴파일 타임에 이뤄진다. 그런데 if else 구조의 {} 블록 내부 결과값들은 전부 같은 타입을 가져야하는데 만약 break를 사용한다면 이에 대하여 컴파일러는 ! 타입으로 인식하고 다른 {} 블록에 존재하는 타입과 동일하다고 판단한다.

 

위의 의문점으로 돌아가서 만약 break나 return (return 도 동일하게 ! 타입을 사용한다) 뒤에 ; 이 붙지 않는 경우 뒤에 후속하는 코드가 존재할 때 컴파일러가 해석을 못하기 때문에 break나 return 뒤에는 ; 이 붙게 된다.

fn example() -> i32 {
    return 10;
    println!("이 코드는 실행되지 않습니다."); // 컴파일러 경고 발생!
    20
}

 

위의 코드는 컴파일러가 경고는 발생하여도 실행은 가능한 코드로 이렇게 return, break 뒤에 코드가 존재해도 실행 가능한 이유는 디버깅의 용이성 때문이라고 한다.

이러한 이유다 보니 사실 break나 return이 {} 블록의 마지막에 존재하는 경우에는 ; 이 없어도 잘 컴파일 및 실행 된다고 한다.

let x = 9;
loop{
    let x: i32 = if x!=9 {
        10      // i32 타입
    } else {
        break  // ! (Never) 타입, 블록의 마지막이므로 ; 생략가능
        println!("!")
    };
}

 

위의 코드는 ; 이 붙어야 하는 것을 설명하는 코드로 실행하면 break 뒤의 println!("!") 를 break println!("!")으로 인식하는 것을 볼 수 있다.

 

 

다시 돌아가서 반복문에 대하여 알아보자.

loop 에는 라벨이 붙을 수 있다. 이는 Java에서도 동일하게 사용되니 작성 생략

 

while도 동일하다.

 

for 문의 경우 for <pattern> in <expression> 구조인데 이 때 rust에서는 1..4 (1,2,3을 의미) 이러한 1..4 와 같은 expression을 주로 사용하는데 1..=4 는 1,2,3,4 를 1..4는 1,2,3 을 의미한다.

python 처럼 패턴 매칭을 사용한다.

 

 

 

'Rust' 카테고리의 다른 글

구조체 (struct), 약간의 메크로 얘기  (0) 2026.01.05
소유권 (Ownership)  (0) 2026.01.04
데이터 타입, 함수  (0) 2026.01.03
Crate와 Library  (0) 2026.01.02
Rust 시작하기  (0) 2026.01.01