Rust 공식 문서를 참고한 글입니다.
프로그램 흐름을 제어하는 방법은 특정 조건이 참일 때만 코드를 수행하거나 특정 조건을 만족하는 동안에만 코드를 수행하도록 하는 것이다. 이를 구현하는 방법이 if 와 loops를 사용하는 것이다.
1. if 표현식
if 표현식은 조건에 따라서 코드를 분기할 수 있게 한다.
fn main() {
let number = 3;
if number < 5 {
println!("condition was true");
} else {
println!("condition was false");
}
}
if 후에 조건을 붙여 조건문을 시작하고, number 이 5보다 작은지 확인한다. 조건을 만족하지 않으면 else 구문으로 처리된다. 이때 if 표현식을 arms라고 표현하는데, match 표현식과 유사하기 때문이다.
만약에, number < 5 구문 대신, number 이라고 하면 어떻게 될까?
fn main() {
let number = 3;
if number {
println!("number was three");
}
}
보통 C언어에서 if (number) {} 이라는 구문을 사용하는데, number 이 true인 경우 처리하여 실행된다. 그러나 Rust에서는 bool 타입이 아닌 타입을 자동으로 bool로 변환하지 않기 때문에, 명시적으로 bool 타입을 제공해야 한다.
if number != 0 {
println!("number was three");
다른 언어들과 마찬가지로, else 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 문은 표현식이기 때문에 let을 사용할 수도 있다. if 문 안에는 하나의 표현식이 선언되어 있고, condition이 true인 경우, 5를, false인 경우 6을 반환하여 number에 바인딩된다.
fn main() {
let condition = true;
let number = if condition { 5 } else { 6 };
println!("The value of number is: {number}");
}
2. 반복문
Rust에는 세 가지 종류의 반복문이 존재한다. loop, while, for이다.
loop
loop를 사용하면 프로그램이 무한정 반복된다. 정지하려면, ctrl-c를 눌려서 멈춰야 한다. 지난 번에 언급했던 것처럼, 명시적으로 loop를 멈출 수 있는 방법도 존재한다.
fn main() {
loop {
println!("again!");
}
}
다시 복습해보면, loop는 스레드 작업 완료 여부를 확인하는 일처럼 실패할 수도 있는 작업을 다시 시도할 때 사용된다. 이 결과를 loop 밖으로 전달해야 할 일이 있는데, 이때 루프를 중단하는 break 뒤에 반환 값을 추가할 수 있다.
loop가 시작하기 전에 counter 값을 0으로 초기화하고, counter를 1씩 증가한다. counter 값이 10인 경우에 정지하고, result에 counter * 2 한 값을 바인딩한다. return counter * 2로 반환할 수도 있는데, break는 현재 loop만 종료하지만 return은 현재 함수를 종료한다.
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The result is {result}");
}
while
loop 중에 조건을 확인해야 하는 경우, while을 사용할 수 있다.
while의 조건문이 true인 경우 loop를 돌고 아닌 경우에는 loop를 빠져나온다.
fn main() {
let mut number = 3;
while number != 0 {
println!("{number}!");
number -= 1;
}
println!("LIFTOFF!!!");
}
For
반복문을 통해 한 배열에 접근할 때, 마지막 인덱스에 도달했는지 while의 조건문으로 확인할 수 있다. 그러나 배열의 길이를 잘못 입력하는 등의 문제가 발생할 수 있다. 이런 경우 while 보다는 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;
}
}
그러나 이러한 방식은 오류가 발생할 수도 있다. 예를 들어서 배열 a를 4개의 원소로 정의했지만, index < 4라는 조건을 수정하지 않으면, 오류가 발생한다. 또한 컴파일러는 반복문을 실행할 때마다 인덱스가 배열의 범위 내에 있는지 여부를 확인하는 조건 검사를 수행하는 런타임 코드를 추가하기 때문에 느릴 수 있다. 조금 더 간결하고 직관적으로 작성하기 위해서 아래와 같이 수정할 수 있다.
이 코드는 배열의 끝에 닿거나 일부 항목을 놓치는 등의 오류 발생을 제거했다. 대부분의 Rust 반복문은 아래와 같이 작성한다고 보면 된다.
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a {
println!("값은: {element}");
}
}
'언어 > Rust' 카테고리의 다른 글
[Rust] 4-2. 참조와 대여 (0) | 2024.09.28 |
---|---|
[Rust] 4-1. 소유권(Ownership) (0) | 2024.09.28 |
[Rust] 3-2. 함수와 주석 (0) | 2024.09.25 |
[Rust] 3-1. 변수와 자료형 (1) | 2024.09.25 |
[Rust] 2. 숫자 맞히기 게임 구현(feat.사용자 입출력과 에러 핸들링) (1) | 2024.09.25 |