# break와 continue

Rust에서 반복문을 제어하기 위해 사용되는 키워드 중 대표적인 것이 break와 continue이다. 이 두 키워드는 반복문의 흐름을 직접적으로 변경하기 때문에 적절히 활용하면 로직을 단순화하고 프로그램의 가독성을 높일 수 있다. 하지만 사용 빈도나 위치를 잘못 설정하면 오히려 흐름 파악이 어려워질 수 있으므로 주의 깊게 살펴볼 필요가 있다. 이 절에서는 break와 continue가 각각 어떤 역할을 하고 어떻게 활용되는지, 그리고 Rust에서 제공하는 추가적인 기능(레이블(Label) 사용 등)에 대해 자세히 설명한다.

반복문은 크게 loop, while, for로 구분할 수 있다. 이 중 break와 continue는 모든 종류의 반복문에서 활용 가능하며, 필요에 따라 내부의 블록 흐름을 즉시 바꾸는 용도로 쓰인다. break는 반복문을 완전히 빠져나오는 기능을, continue는 해당 반복의 남은 부분을 건너뛰고 다음 반복으로 넘어가는 기능을 제공한다. 이러한 제어 흐름 변경은 성능이나 코드 단순화 측면에서 유용할 수 있지만, 너무 자주 사용하거나 복잡하게 얽어서 쓰면 코드를 읽는 이에게 혼동을 줄 수 있다. 따라서 사용 시 반드시 의도를 명확하게 드러내야 한다.

### break 키워드

Rust에서 break를 사용하면 현재 실행 중인 반복문을 즉시 종료한다. 일반적으로 while 또는 for 루프 내부에서 조건을 만족하면 반복을 끝내기 위해 break를 자주 쓴다. 다른 언어와 달리 Rust의 loop는 기본적으로 무한 루프로 작성할 수 있으므로, 이런 무한 루프를 인위적으로 탈출하는 목적으로도 break를 활용한다.

아래는 break를 통해 반복문을 종료하는 전형적인 예시이다.

```rust
fn main() {
    let mut count = 0;
    loop {
        count += 1;
        if count > 5 {
            break;
        }
        println!("count: {}", count);
    }
    println!("반복문 종료 후 count: {}", count);
}
```

이 예시에서 loop는 무한 반복이지만, count가 5를 초과하면 break를 통해 즉시 빠져나온다. 따라서 6번 이상 증가하는 일 없이 반복이 끝나고, 최종적으로 count는 6이 된다.

Rust는 단순 종료 외에도 break 키워드를 활용해 loop의 결과값을 반환할 수 있다. loop 자체가 표현식(Expression)으로 간주되기 때문이다. 다음 예시를 보자.

```rust
fn main() {
    let result = loop {
        // 어떤 작업을 수행
        break 10; // break 키워드 뒤에 반환값을 지정
    };
    println!("result: {}", result);
}
```

이 코드에서 loop 내부에서 break 10을 실행하면 loop 표현식의 결과로 10이 반환된다. 따라서 result 변수에는 10이 할당된다. while과 for 루프에서는 이런 식의 반환값을 지정할 수 없고, 오직 loop에서만 반환값이 가능하다.

여러 개의 중첩된 반복문이 있을 때 특정 반복문 하나만 빠져나가고 싶다면, Rust의 레이블(Label) 기능을 사용할 수 있다. 레이블은 반복문 앞에 `'label_name:` 형태로 작성하고, break나 continue 뒤에 `'label_name`을 붙여서 어떤 반복문을 대상으로 할 것인지 지정해 준다. 예시는 다음과 같다.

```rust
fn main() {
    'outer: for x in 0..5 {
        for y in 0..5 {
            if x + y > 5 {
                break 'outer; // 가장 바깥쪽 반복문을 종료
            }
            println!("x: {}, y: {}", x, y);
        }
    }
    println!("중첩 반복문 종료");
}
```

이 예시에서 x + y가 5를 초과하면 즉시 'outer 레이블이 붙은 바깥 for 루프를 빠져나간다. 레이블을 사용하지 않으면 break는 자신이 속한 가장 가까운 반복문만 탈출하기 때문에, 중첩 구조를 명확히 컨트롤하려면 레이블을 활용해야 한다.

### continue 키워드

Rust에서 continue 키워드는 현재 반복을 중단하고 다음 반복으로 즉시 넘어가도록 한다. 반복문 내에서 특정 조건을 만족하지 않는 경우에 작업을 건너뛰고 싶거나, 굳이 남은 코드를 실행할 필요가 없을 때 continue를 사용한다. 조건을 분기하고 빠른 판단으로 넘어갈 수 있으므로 코드 흐름이 간단해질 수 있으나, 과도하게 사용하면 반복 블록의 논리 구조가 복잡해질 수 있다.

다음 예시는 count가 짝수일 때는 출력하지 않고 바로 다음 반복으로 넘어가는 상황을 나타낸다.

```rust
fn main() {
    for count in 0..10 {
        if count % 2 == 0 {
            continue;
        }
        println!("count: {}", count);
    }
}
```

이 코드에서 count가 짝수이면 if 블록을 통과하여 continue를 실행하고, 남은 println! 부분은 건너뛴다. 결국 출력되는 값은 모두 홀수인 1, 3, 5, 7, 9가 된다.

continue 역시 break와 마찬가지로 레이블을 활용하여 중첩된 반복문을 제어할 수 있다. 단순히 현재 루프가 아닌 상위 레벨의 반복문 단계로 넘어가고 싶다면, continue 뒤에 레이블을 붙일 수 있다. 다만 일반적인 상황에서는 break를 레이블과 함께 쓰는 경우가 좀 더 잦다.

레이블이 적용된 예시는 다음과 같다.

```rust
fn main() {
    'outer: for x in 0..3 {
        for y in 0..3 {
            if x == y {
                continue 'outer;
            }
            println!("x: {}, y: {}", x, y);
        }
    }
}
```

이 예시에서 x == y인 상황이 오면 'outer 레이블이 붙은 바깥 for 루프의 다음 반복으로 넘어간다. 따라서 내포된 for 루프 내부는 더 이상 진행되지 않고, x의 다음 값으로 외부 루프를 진행하게 된다.

break와 continue는 반복문을 강력하게 제어할 수 있지만, 사용 시 의도가 선명하게 드러나도록 주의해야 한다. 무분별하게 사용하면 반복문을 추적하기 어려워지고, 간단한 로직이라도 복잡해 보일 수 있다. 그리고 레이블은 중첩된 구조를 깔끔하게 빠져나가거나 건너뛸 때만 제한적으로 적용하는 것이 좋다. Rust의 제어 흐름은 명시적 설계를 중시하므로, break와 continue의 목적과 범위가 명확할 때만 사용하길 권장한다.

결국 break는 반복문의 즉시 종료, continue는 현재 반복의 일부 로직 스킵 후 다음 반복 진행이라는 두 가지 중요한 제어를 맡는다. 필요에 따라 적절히 활용하면 반복문 구조를 깔끔하게 유지하고 성능이나 가독성 면에서 이점을 얻을 수 있다. 다만 복잡한 조건부 로직이 얽힌 곳에서는 코드가 난해해질 위험이 있으므로, 상황에 맞춰 적절히 사용하는 습관을 갖추는 것이 좋다.
