제어문는 프로그래밍에서 코드 실행 흐름을 제어하는 기본 메커니즘입니다. 모든 프로그래밍 언어는 조건문, 반복문 등의 제어문 도구를 제공하며, 이를 통해 개발자는 프로그램의 논리를 효과적으로 설계할 수 있습니다. Rust는 메모리 안전성과 성능을 동시에 추구하는 언어로, 강력하면서도 직관적인 제어문 도구를 제공합니다.
이 글에서는 Rust의 제어문 개념을 초보자와 숙련자 모두 이해할 수 있도록 자세히 설명하고, 예제와 함께 실제 활용 방안을 탐구합니다.
1. Rust의 기본 제어문 요소
1.1 조건문: if
, else
, 그리고 else if
Rust에서 조건문은 프로그램이 특정 조건에 따라 다른 코드를 실행하도록 합니다.
- 기본
if
조건문:
fn main() {
let number = 7;
if number < 10 {
println!("Number is less than 10");
} else {
println!("Number is 10 or greater");
}
}
else if
를 활용한 다단계 조건:
fn main() {
let number = 15;
if number % 3 == 0 && number % 5 == 0 {
println!("Number is divisible by both 3 and 5");
} else if number % 3 == 0 {
println!("Number is divisible by 3");
} else if number % 5 == 0 {
println!("Number is divisible by 5");
} else {
println!("Number is not divisible by 3 or 5");
}
}
if
표현식: Rust의 조건문은 값으로 평가될 수 있습니다. 이를 통해 변수 초기화 시 더 간결한 코드를 작성할 수 있습니다.
let number = 5;
let message = if number > 0 { "Positive" } else { "Negative or Zero" };
println!("{}", message);
1.2 반복문: loop
, while
, for
Rust는 다양한 반복문을 제공하며, 각 반복문은 고유한 사용 사례에 적합합니다.
아래의 설명을 읽어보고 더 자세한 반복문의 활용은 아래의 글을 참고해보세요.
[Rust] - [Rust] Loops in Rust (Rust에서의 반복문)
loop
: 무한 반복을 수행하며,break
로 종료합니다.
fn main() {
let mut count = 0;
loop {
count += 1;
if count == 5 {
println!("Count reached 5, exiting loop.");
break;
}
}
}
while
: 특정 조건이 참인 동안 반복합니다.
fn main() {
let mut num = 3;
while num > 0 {
println!("Number is: {}", num);
num -= 1;
}
}
for
: 컬렉션을 순회하는 가장 간결한 방법입니다.
fn main() {
let array = [10, 20, 30, 40];
for value in array {
println!("Value is: {}", value);
}
}
- 인덱스 기반 반복:
fn main() {
for i in 0..5 {
println!("Index is: {}", i);
}
}
2. Rust만의 고유한 제어문
2.1 match
표현식
Rust의 match
는 패턴 매칭을 활용한 강력한 제어문 도구입니다. 여러 조건을 한 번에 처리할 수 있어 코드의 가독성을 높여줍니다.
- 기본 사용법:
fn main() {
let value = 3;
match value {
1 => println!("One"),
2 => println!("Two"),
3 => println!("Three"),
_ => println!("Something else"),
}
}
- 범위 매칭:
fn main() {
let value = 7;
match value {
1..=5 => println!("Between 1 and 5"),
6..=10 => println!("Between 6 and 10"),
_ => println!("Out of range"),
}
}
Option
타입과match
:
fn main() {
let some_value = Some(42);
match some_value {
Some(x) => println!("Found: {}", x),
None => println!("Nothing found"),
}
}
2.2 if let
과 while let
if let
과 while let
은 코드의 간결성을 높이면서 특정 값을 매칭하여 처리할 수 있는 강력한 도구입니다.
if let
:
if let Some(value) = Some(10) {
println!("Value is: {}", value);
}
while let
:
fn main() {
let mut stack = vec![1, 2, 3, 4];
while let Some(top) = stack.pop() {
println!("Popped: {}", top);
}
}
3. 고급 제어문 기술
3.1 Iterator와 고급 패턴
Rust의 Iterator
와 Closure
는 반복문의 유연성을 극대화합니다.
map
메서드 활용:
fn main() {
let numbers = vec![1, 2, 3, 4];
let squared: Vec<_> = numbers.iter().map(|x| x * x).collect();
println!("{:?}", squared);
}
3.2 에러 제어와 try
블록
Rust 1.65 이후로 추가된 try
블록은 에러 흐름 제어를 간소화합니다.
fn main() -> Result<(), String> {
let value = try {
let x = "42".parse::<i32>()?;
x * 2
};
println!("Value: {:?}", value);
Ok(())
}
4. 실제 프로젝트에서의 제어문
제어문는 실제 애플리케이션에서 복잡한 로직을 간단히 처리할 수 있도록 합니다.
- API 요청 처리:
fn handle_request(status_code: u16) {
match status_code {
200 => println!("OK"),
404 => println!("Not Found"),
_ => println!("Unknown status code"),
}
}
- 에러와 Result 결합:
fn divide(a: i32, b: i32) -> Result<i32, String> {
if b == 0 {
Err("Cannot divide by zero".to_string())
} else {
Ok(a / b)
}
}
5. 결론
Rust의 제어문는 안전성과 효율성을 극대화하는 데 필수적인 요소입니다. 조건문, 반복문, 패턴 매칭, 고급 반복자 활용 등 다양한 도구를 통해 복잡한 로직도 간결하게 표현할 수 있습니다. 이 글에서 제공한 예제를 따라 해보며 Rust의 제어문를 실습하고, 더 안전하고 강력한 애플리케이션을 만들어 보세요.
Reference
- https://doc.rust-lang.org/book/ch03-05-control-flow.html
- https://doc.rust-kr.org/ch03-05-control-flow.html
- Blandy, J., Orendorff, J., and Tindall, L. F. S. 2021. Programming Rust: Fast, Safe Systems Development. 2nd ed. O'Reilly Media, Sebastopol, CA.