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 |