Deep Dive: Rust의 반복문

러스트는 loop, while, for 세 가지 종류의 반복문을 제공합니다. 각각의 용도와 특성을 이해하면 더 효율적이고 안전한 코드를 작성할 수 있습니다. 이번 에피소드에서는 각 반복문의 특징과 사용 사례, 그리고 반복문에서 값을 반환하는 독특한 기능까지 살펴봅니다.


1. loop: 무한 루프와 제어

loop는 명시적으로 중단시키기 전까지 영원히 반복되는 가장 기본적인 반복문입니다.

loop {
    println!("again!");
    // break 키워드로 이 루프를 중단해야 합니다.
}

break 키워드를 사용하여 루프를 탈출할 수 있으며, continue를 사용해 현재 반복을 건너뛰고 다음 반복으로 넘어갈 수 있습니다.

loop에서 값 반환하기

loop는 표현식(expression)이므로 값을 반환할 수 있습니다. break 키워드 뒤에 반환할 값을 명시하면, 루프가 중단될 때 그 값이 loop 표현식의 결과가 됩니다.

let mut counter = 0;
 
let result = loop {
    counter += 1;
 
    if counter == 10 {
        break counter * 2; // 루프를 중단하고 20을 반환
    }
};
 
println!("The result is {result}"); // 20

이 기능은 특정 조건이 만족될 때까지 연산을 반복하고 그 결과를 변수에 할당하는 패턴에 매우 유용합니다.


2. while: 조건부 반복

while은 주어진 조건이 참(true)인 동안 계속해서 코드 블록을 반복합니다.

let mut number = 3;
 
while number != 0 {
    println!("{number}!");
 
    number -= 1;
}
 
println!("LIFTOFF!!!");
  • 용도: 반복 횟수를 정확히 알 수 없고, 특정 조건이 만족되는 동안만 코드를 실행해야 할 때 유용합니다.

3. for: 컬렉션 순회

for 루프는 배열, 벡터, 범위(range) 등 이터레이터(iterator)를 제공하는 컬렉션의 각 요소를 순회하는 데 가장 많이 사용됩니다.

let a = [10, 20, 30, 40, 50];
 
for element in a {
    println!("the value is: {element}");
}

for 루프는 while 루프보다 훨씬 안전하고 간결합니다. while을 사용해 배열을 순회하면 인덱스 범위를 벗어나는 패닉(panic)이 발생할 위험이 있지만, for 루프는 컴파일러가 컬렉션의 길이를 알고 있어 이러한 실수를 원천적으로 방지합니다.

범위(Range)와 함께 사용하기

for 루프는 특정 횟수만큼 코드를 반복하고 싶을 때 Range와 함께 자주 사용됩니다.

// 1부터 4까지 (4는 미포함)
for number in 1..4 {
    println!("{number}!");
}
 
// 역순으로 반복하려면 .rev() 메소드를 사용합니다.
for number in (1..4).rev() {
    println!("{number}!");
}
구분주요 용도특징주의사항
loop무한 루프, 재시도 로직break로 탈출, 값을 반환할 수 있음break 조건이 없으면 영원히 실행됨
while조건 기반 반복조건이 false가 될 때까지 실행인덱스 기반 제어 시 범위 오류 발생 가능
for컬렉션/이터레이터 순회가장 안전하고 간결한 순회 방법, 패닉 위험 적음for 루프는 이터레이터 소유권을 가져옴

러스트의 반복문은 각기 다른 시나리오에 최적화되어 있습니다. 무한 루프가 필요하면 loop를, 조건에 따른 반복이 필요하면 while을, 그리고 컬렉션을 안전하게 순회하려면 for를 사용하는 것이 좋습니다. 이러한 도구들을 적재적소에 활용하여 명확하고 버그 없는 코드를 작성할 수 있습니다.