일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- vgw
- 단축 평가
- docker swarm
- JavaScript
- 러스트
- rust
- null 병합 연산자
- Service
- api gateway
- 온프레미스
- 옵셔널 체이닝
- 비구조화 할당
- transit gateway
- Await
- On-Premise
- Custom Resource
- 자바스크립트
- optional chaining
- Site-to-Site VPN
- Proxy Resource
- prometheus
- docker
- cognito
- 구조분해 할당
- grafana
- VPC
- Kubernetes
- Endpoints
- elasticsearch
- AWS
- Today
- Total
만자의 개발일지
[Rust] 조건문과 반복문 본문
저번 포스팅에서 함수와 표현식에 대해 알아보았습니다. 이번 포스팅에서 설명할 조건문과 반복분 역시 표현식입니다.
조건문과 반복문에 어떤 다양한 표현식들이 있고 어떻게 사용하는 알아보도록 하겠습니다.
조건문(If expression)
if 문은 조건에 따라 코드를 실행하는 구조입니다. 다른 언어와 마찬가지로 else, else if 블록을 통해 여러 조건을 평가할 수 있으며, 표현식 뒤에 블록을 ({ }) 생략할 수 없습니다.
fn main() {
let x = 5;
if x > 5 {
println!("x > 5");
} else if x == 5{
println!("x == 5");
} else {
println!("x < 5");
}
}
또한 if 문 뒤에 오는 조건식은 반드시 bool 타입이어야 합니다. 다음과 같이 조건식이 bool 타입이 아니라면 타입 불일치 에러를 발생시킵니다.
fn main() {
let number = 1;
if number {
println!("number is one");
}
}
if 문은 표현식이기 때문에 값을 반환합니다. 따라서 다음과 같이 반환된 값을 변수에 할당하여 사용할 수 있습니다.
fn main() {
let x = 7;
let y = 10;
let big = if x > y {
x
} else {
y
};
println!("{}", big);
}
if 문을 사용할 때 주의해야 할 점은 각 블록의 반환 값이 같은 타입이어야 한다는 것입니다. 만약 if 블록과 else 블록의 반환 값이 다른 타입이라면 다음과 같은 에러를 발생시킬 것입니다.
fn main() {
let condition = true;
let number = if condition {
1
} else {
"zero"
};
println!("The value of number is: {number}");
}
서로 다른 블록에서 다른 타입의 값을 반환하는 것이 아예 불가능한 것은 아닙니다. Rust에서 제공하는 동적 디스패치라는 기능을 통해 해결할 수 있습니다. 이는 추후에 알아보도록 하겠습니다.
반복분(Loop expressions)
반복문에는 loop, while, for 문과 반복문(loop) 내부에서 사용되는 break 와 continue 문이 있습니다.
- break 문은 루프를 종료하거나 종료와 동시에 값을 반환할 수 있습니다.
- continue 문은 현재 반복을 건너뛰고, 다음 반복으로 넘어갑니다.
loop expression
loop 문은 블록안에 작성된 코드들을 무한히 반복(infinite loops)하여 실행합니다.
fn main() {
let mut count = 0;
loop {
count += 1;
println!("Count is: {}", count);
if count == 5 {
break;
}
}
// Count is: 1
// Count is: 2
// Count is: 3
// Count is: 4
// Count is: 5
}
count는 루프가 반복할 때마다 1 씩 증가하고 count 값이 몇인지 출력합니다. 계속 반복하다 count가 5가 되면 break 가 실행되어 루프를 종료합니다.
loop 문의 경우 break 를 사용해 루프를 종료함과 동시에 값을 반환할 수도 있습니다.
fn main() {
let mut count = 0;
let result = loop {
count += 1;
if count == 5 {
break count * 2;
}
};
println!("The result is {result}"); // The result is 10
}
while expression
while 문은 뒤에 조건을 명시해야 합니다. 명시된 조건을 먼저 평가하고, 조건이 true 일 때만 반복하며, 조건이 false 가 되면 루프를 종료합니다. 명확한 종료 조건이 있을 때 사용하기 좋습니다.
fn main() {
let mut number = 3;
while number != 0 { // number가 0 이되면 false, loop 종료
println!("{}!", number);
number -= 1;
}
println!("LIFTOFF!!!");
// 3! 2! 1! LIFTOFF!!!
}
for expression
for 문은 범위, 배열과 같이 반복 가능한 요소를 순회할 때 사용합니다. for 문은 in 키워드와 함께 사용합니다.
for 문뒤에 각 요소의 값을 저장할 변수명을 명시하고, in 키워드 뒤에 범위나 배열 등을 명시하여 사용합니다.
fn main() {
let arr = [10, 20, 30, 40, 50];
for element in arr {
println!("the value is: {}", element);
}
// the value is: 10
// the value is: 20
// the value is: 30
// the value is: 40
// the value is: 50
}
for 문은 배열의 각요소를 순차적으로 순회하고 각 요소는 element 에 저장되어 사용할 수 있습니다.
또한 .. , ..= 과 같은 범위 표현식을 사용하여 특정한 범위를 순회하도록 할 수 있습니다.
fn main() {
for i in 1..4 {
println!("{} ", i);
}
// 1 2 3
println!("==================");
for i in 1..=4 {
println!("{} ", i);
}
// 1 2 3 4
}
break and continue expressions
위에서 설명했다시피 break 는 현재 루프를 종료시킬 때 사용하고, continue 는 현재 반복을 건너뛰고 다음 반복으로 넘어갈 때 사용합니다.
fn main() {
for i in 1..=100 {
if i == 10 {
break;
}
if i % 2 == 0 {
continue;
}
print!("{} ", i);
}
// 1 3 5 7 9
}
1에서 100까지 순회하는 for 문입니다. i 가 짝수면 cotinue 가 실행되고 출력하지 않고 다음 순회로 넘어갑니다. 계속 순회하다 i 가 10 이되면 break 가 실행되어 loop를 종료합니다.
Loop labels
루프 라벨은 중첩 루프 상황에서 특정 루프를 명시적으로 제어 할 수 있도록 도와주는 기능입니다.
loop, while, for 문 모두 사용가능하며, break 와 continue 를 같이 사용하여 루프의 흐름을 제어할 수 있습니다.
사용방법은 반복문 앞에 'label: 을 통해 사용할 수 있습니다. .
fn main() {
let mut outer_count = 0;
'outer: loop {
println!("Outer loop start: {}", outer_count);
let mut inner_count = 0;
loop {
println!(" Inner loop: {}", inner_count);
inner_count += 1;
if inner_count == 2 {
println!(" -> continue outer loop");
outer_count += 1;
continue 'outer; // continue 'outer loop
}
if outer_count == 3 {
println!(" -> breaking outer loop");
break 'outer; // break 'outer loop
}
}
println!("This line is skipped when |continue 'outer;| is used");
}
println!("Exited the loop at outer_count = {}", outer_count);
}
- continue 'label 은 '해당 루프의 다음 반복으로 건너뛴다'는 의미입니다.
- break 'label 은 '해당 루프를 종료한다'는 의미입니다.
Labelled block expression
라벨은 반복문 뿐만 아니라 블록에서도 사용할 수 있습니다. 루프 라벨과 사용방법은 동일 합니다.
fn main() {
let result = 'outer: {
println!("Entered outer block");
let inner_result = 'inner: {
println!("Entered inner block");
if true {
println!("Breaking out of outer block from inner!");
break 'outer 1; // break 'outer block
}
0 // if false 일 경우 실행
};
println!("Inner block result: {}", inner_result); // if false 일 경우 실행
-1 // if false 일 경우 실행
};
println!("Final result: {}", result); // Final result: 1
}
break 를 사용하여 값을 반환하면서 블록을 탈출할 수 있습니다.
break 는 원래 반복문 밖에서 사용을 할 수 없지만 라벨이 명시된 블록에 한에서 사용할 수 있습니다.
이번 포스팅에서는 조건문과 반복문에 대해 알아보았습니다. 다음 포스팅에서는 구조체와 메서드 & 연관함수에 대해서 알아보도록 하겠습니다.
참고
'Rust' 카테고리의 다른 글
[Rust] 열거형 (0) | 2025.05.18 |
---|---|
[Rust] 구조체와 메서드 & 연관 함수 (0) | 2025.05.04 |
[Rust] 함수와 표현식 (0) | 2025.04.29 |
[Rust] 변수와 타입 (0) | 2025.04.28 |