hyunsu blog

홈강좌Rust 입문·중급 47편 중 13편째

Rust loop 와 while — break 로 끝내고, continue 로 건너뛴다

목차 · 4
  1. 01loop 는 break 를 만날 때까지 돈다
  2. 02break 로 값을 돌려준다
  3. 03while 은 조건이 참인 동안 돈다
  4. 04실습 — continue 로 짝수 건너뛰기

Rust 의 loop 는 break 를 만날 때까지 되풀이하고, break 값 으로 반복을 끝내면서 값을 돌려줄 수 있다. while 은 조건이 참인 동안 되풀이한다. continue 는 이번 차례의 나머지를 건너뛰고 다음 차례로 간다.

01 loop 는 break 를 만날 때까지 돈다

매주 3만 원씩 모아 10만 원이 되려면 몇 주가 걸릴까.

rust
fn main() {
    let mut saved = 0;
    let mut weeks = 0;

    loop {
        saved = saved + 30000;
        weeks = weeks + 1;
        if saved >= 100000 {
            break;
        }
    }

    println!("{weeks} weeks, {saved} won");
}
text
   Compiling savings v0.1.0 (~/projects/savings)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.18s
     Running `target/debug/savings`
4 weeks, 120000 won
  • loop { … } 는 중괄호 안을 끝없이 되풀이한다.
  • 안에서 break 를 만나면 반복을 끝내고 loop 다음 줄로 간다.
  • 그래서 loop 안에는 언제 끝낼지 정하는 if 가 거의 늘 함께 있다. 여기서는 모은 돈이 10만 원 이상이 되면 끝낸다.

break 를 빠뜨리면 프로그램이 영원히 돈다. 그럴 때는 터미널에서 Ctrl + C 로 멈춘다.

02 break 로 값을 돌려준다

loop 도 if 처럼(12편) 값을 낼 수 있다. break 뒤에 값을 쓰면, 반복을 끝내면서 그 값이 loop 전체의 값이 된다.

rust
fn main() {
    let mut saved = 0;
    let mut weeks = 0;

    let result = loop {
        saved = saved + 30000;
        weeks = weeks + 1;
        if saved >= 100000 {
            break weeks;
        }
    };

    println!("{result} weeks");
}
text
   Compiling savings v0.1.0 (~/projects/savings)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.16s
     Running `target/debug/savings`
4 weeks

break weeks; 로 끝낸 순간의 weeks 가 result 에 담겼다. 반복이 끝나야 알 수 있는 값을 변수에 바로 받을 때 쓴다. let result = loop { … }; 끝의 세미콜론을 잊지 않는다. let 문 전체가 여기서 끝나기 때문이다.

03 while 은 조건이 참인 동안 돈다

끝낼 조건이 반복의 맨 앞에 오면 while 이 더 짧다.

rust
fn main() {
    let mut n = 3;

    while n > 0 {
        println!("{n}...");
        n = n - 1;
    }

    println!("go!");
}
text
   Compiling countdown v0.1.0 (~/projects/countdown)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.17s
     Running `target/debug/countdown`
3...
2...
1...
go!

while n > 0 은 "n 이 0 보다 큰 동안" 이다. 매번 중괄호에 들어가기 전에 조건을 보고, 거짓이 되면 끝낸다. n 이 0 이 되자 반복이 끝나고 go! 가 찍혔다. loop 안에 if … { break; } 를 맨 앞에 둔 것과 같다.

04 실습 — continue 로 짝수 건너뛰기

1 부터 6 까지 가운데 홀수만 찍어 보자.

rust
fn main() {
    let mut n = 0;

    while n < 6 {
        n = n + 1;
        if n % 2 == 0 {
            continue;
        }
        println!("{n}");
    }
}
text
   Compiling odd v0.1.0 (~/projects/odd)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.16s
     Running `target/debug/odd`
1
3
5

n % 2 == 0 은 "2 로 나눈 나머지가 0", 즉 짝수인지 묻는다(5편의 %). 짝수면 continue 가 이번 차례의 나머지(println!)를 건너뛰고 바로 다음 차례로 간다. 그래서 홀수만 찍혔다.

continue 를 쓸 때는 n = n + 1; 처럼 반복을 앞으로 보내는 줄이 continue 보다 앞에 있어야 한다. 뒤에 있으면 짝수에서 건너뛸 때마다 그 줄도 건너뛰어 n 이 영영 안 늘어난다. 줄 순서를 바꿔서 정말 그런지 확인해 보자. 끝나지 않으면 Ctrl + C 다. 다음 편은 정해진 범위나 배열을 도는 for 다.