Dev/Language

반복문과 루프 레이블 - Rust 프로그래밍

TaeGit 2022. 8. 14. 22:54

Rust 반복문

while

while 반복문은 많은 언어들에서 사용하는 방식과 유사하다.
while 반복문은 주어진 조건이 참이면 처리를 반복한다.

let mut count = 0;

while count < 10 {
    println!("{}", count);
    count += 1;
}

 

많은 언어들에서 무한 반복문을 만들기 위해 while 문을 아래와 같이 활용한다.

while true {
    println!("무한 반복");
}

 

러스트에서는 loop 키워드를 통해 더 간단히 해결할 수 있다.
위 코드를 빌드하면 아래와 같이 Rust 컴파일러가 친절하게 loop를 사용하라는 warning을 보여준다.

 

loop

loop 키워드는 다음에 오는 코드 블록을 무한히 반복하는데, break 키워드를 만나거나 프로그램이 종료될 때까지 계속 실행한다.

let mut count = 0;

loop {
    println!("{}", count);
    count += 1;
    if count == 10 {
        break;
    }
}

 

for

for 키워드는 다른 많은 언어들이 반복문을 생성하기 위해 지원하는 키워드다.
Rust 언어 역시 for 키워드를 지원하고, 기본적인 형태는 아래와 같다.

let items = [1,2,3,4,5];

for item in items {
    println!("{}", item);
}

println!("{:?}", items);

 

다만, 위 코드는 컴파일 시 다음과 같은 에러가 발생한다.

 

Rust 컴파일러가 출력해준 내용 처럼 이유는 맨 마지막 라인이다.
items 변수는 for 문으로 소유권이 이동됬고, 이동된 items 변수를 마지막 라인에서 사용하려 했기 때문이다.

이를 이해 하기 위해선 for 문이 동작하는 방식을 알아야한다.


for 반복문은 아래와 같이 세 가지 형태의 메소드로 호출로 확장된다.

  1. for item in items -> for item in IntoIterator::into_iter(items)
  2. for item in &items -> for item in items.iter()
  3. for item in &mut items -> for item in items.iter_mut()

바로 위에서 본 코드는 1번에 해당하는데,
items의 소유권이 into_iter() 메소드로 넘어가서 컴파일 에러가 발생한 것이다.

 

따라서, items 변수를 읽기 전용으로 반복문을 돌리고,
반복문이 끝난 후에도 소유권을 유지하기 위해서는 아래와 같이 사용해야 한다.

for item in &items {
    ...
}

println!("{:?}", items);
for item in items.iter() {
    ...
}

println!("{:?}", items);

 

for label

Rust에는 goto 키워드가 없는데, 특정 조건에 의해 이중 반복문을 빠져나와야하는 경우 label 을 사용할 수 있다.

for문에 label을 달고 상황에 맞게 break 키워드를 사용한다.

'outer: for x in 5..50 {
    println!("x => {}", x);
    for y in 0..10 {
        println!("y => {}", y);
        if x == y {
            break 'outer;
        }
    }
}

println!("빠져나왔다.");

실행 결과

x => 5
y => 0
y => 1
y => 2
y => 3
y => 4
y => 5
빠져나왔다.

루프 label은 아스트로피(`)를 사용하는데, 이는 lifetime의 구문과 유사하지만 전혀 다르며 명확히 구분된다.