# while과 loop

Rust에서 반복적인 작업을 처리하기 위한 제어 흐름 도구로 while과 loop 키워드를 자주 활용한다. 두 키워드는 모두 반복 구조를 형성하지만 사용 목적과 특징에서 미묘한 차이가 있다. while은 특정 조건이 참(true)인 동안 반복 실행하는 구조를 형성하고, loop는 종료 조건 없이 무한히 반복할 수 있는 구조를 형성한다. Rust는 이 두 방식을 모두 강력하고 안전하게 지원하며, break와 continue 같은 키워드로 반복을 제어한다.

while은 조건이 참인 동안만 블록 내부를 반복 실행한다는 점에서 다른 언어의 while 문과 유사하다. 실행하기 전에 조건을 평가하며, 조건이 거짓(false)이 되는 순간 반복을 멈춘다. 다음 예제에서는 while을 사용해 특정 조건이 만족될 때까지 변수를 증가시키는 과정을 살펴볼 수 있다.

```
fn main() {
    let mut count = 0;
    while count < 5 {
        println!("count is {}", count);
        count += 1;
    }
    println!("while 반복 종료 후 count 값: {}", count);
}
```

위 예제에서 while 다음에 적힌 조건식 count < 5가 참인 동안 본문 블록이 계속 반복된다. count가 5 이상이 되는 순간 조건이 거짓이 되어 while 반복문이 종료된다. Rust는 조건식에 bool 타입을 요구하므로, 다른 언어와 달리 0이나 1 같은 정수로 조건을 대신 표현할 수 없다는 점을 유념해야 한다.

loop는 종료 조건 없이 무한히 반복을 수행한다. 이때 반복을 중단하기 위해 break 키워드를 사용한다. loop는 매우 단순한 키워드이지만 Rust에서만 볼 수 있는 독특한 특징이 있다. 반복문 그 자체가 값(value)이 될 수 있어, 필요한 경우 break 뒤에 값을 지정해 반복문 전체에서 어떤 값을 반환하도록 할 수 있다.

```
fn main() {
    let mut counter = 0;
    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };
    println!("loop가 반환한 결과: {}", result);
}
```

이 예제에서 loop는 무조건 계속 실행되지만, counter가 10이 되면 break를 통해 counter \* 2 값을 반환하고 반복문을 종료한다. 이 때 loop 전체가 반환한 값은 result 변수에 할당된다. 이는 다른 언어의 무한 루프와 달리, Rust의 loop는 제어 흐름 구문이면서 동시에 표현식(expression)이 될 수 있음을 보여주는 예시다.

무한 루프를 작성할 때는 종료 조건을 코드 내부에서 break로 결정한다. 혹은 의도적으로 중단되지 않는 프로그램을 만들 때도 loop가 유용하다. 하지만 대부분의 경우 break를 적절히 배치하여 원하는 순간에 루프를 종료하는 방식을 택한다. 또한 continue를 사용하면 현재 반복을 중단하고 다음 반복으로 건너뛸 수 있다.

```
fn main() {
    let mut num = 0;
    loop {
        num += 1;

        if num % 2 == 0 {
            continue; 
        }

        println!("홀수만 출력: {}", num);

        if num > 10 {
            break;
        }
    }
}
```

위 예제에서는 num이 짝수이면 continue를 사용하여 반복 블록의 남은 코드를 실행하지 않고 즉시 다음 반복으로 넘어간다. num이 11을 초과하면 break로 반복을 완전히 종료한다. Rust에서는 이처럼 loop를 적절히 제어하는 기법을 이용해 구조적이고 가독성 좋은 코드를 작성할 수 있다.

Rust는 loop에 레이블(label)을 붙이고 break나 continue에 레이블을 명시함으로써 중첩된 루프를 효과적으로 제어하는 기능도 제공한다. 예를 들어 loop를 중첩할 때, 특정 루프만 빠져나가거나 넘어가고 싶다면 'outer: 같은 레이블을 붙이고 break 'outer; 또는 continue 'outer; 구문을 사용할 수 있다. 이를 통해 코드가 여러 겹의 루프를 포함해도, 정확히 원하는 위치의 루프를 탈출하거나 반복을 건너뛰는 로직을 간단명료하게 관리한다.

Rust에서 while과 loop를 선택하는 기준은 반복 종료 조건을 어디에서 어떻게 관리하고 싶은지에 달려 있다. 논리적 조건으로 반복을 제어하고 싶다면 while을 사용한다. 반면 반복 로직 자체에서 명시적으로 종료 타이밍을 결정하고 싶거나, 반복문 자체가 값을 반환해야 한다면 loop를 활용한다. 두 방법 모두 안전성, 가독성, 성능 측면에서 Rust의 철학을 잘 반영하고 있으며, 상황에 맞게 적절히 쓰면 효율적이고 명확한 반복 구조를 만들 수 있다.
