본문 바로가기

Rust

[Rust] 제어문 If-else, while, do-while

반응형

if statement

제어문, if-else 류는 문들은 보통 모든 언어들에 있는 구문이고, 여기서는 rust가 다른 언어들과 조금 다른 점들만 기술합니다.

if [conditions]  ...  // condition은 boolean식만 들어갈 수 있다. 

“? : ” 와 같은 삼항 연산자 역시 제대로 동작합니다 특이한 점은 condition에 괄호() 가 필요 없다는점입니다.

if condition {
  ...
} 
else {
  ...
}

Conditional loop(while)

while같은 conditional loop도 동일합니다. 조건이 만족하면 loop가 실행되고, 아니면 빠져나가는것입니다. do-while은 rust에서는 지원하지 않습니다만, 이것을 구현하는 방법은 존재합니다.

let mut i = 1; 
while i <=10 {
  print!("{}, ",i);
  i +=1;
}

// 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 

여기서 C언어와 마찬가지로 while 키워드를 사용합니다. 뒤에 오는 부울 조건이 평가되고 값이 true이면 다음 블록이 실행됩니다. while 문은 블록을 실행한 후 조건이 false로 평가되거나 다른 이유로 블록이 종료될 때까지 조건 평가를 반복하고 블록을 다시 실행하기 때문에 if 문과 다릅니다.

이 구문은 이미 if 문의 구문에 대해 본 것과 동일한 측면에서 C와 같은 다른 언어와 다릅니다. 이 예에서 가변 변수 n은 정수로 선언되고 1로 초기화됩니다. 이는 출력하려는 수를 나타냅니다. while 문은 해당 값이 10 값보다 작거나 같은지 확인하고 그대로 블록을 실행합니다. 블록 내에서 n 값이 증가합니다. 블록 실행 후 부울 조건이 다시 평가됩니다. 10번의 반복 후에 n의 값은 11입니다. 이 시점에서 루프의 조건이 더 이상 충족되지 않으므로 while 문의 실행이 종료됩니다.

그리고, C 언어에는 do … while-문이 있지만 Rust에는 그러한 문이 없습니다. 대신 C 언어의 동일한 break 및 continue 문도 Rust에 존재합니다. 그들의 목적은 각각 전체 루프에서 조기에 종료하는 것이며, 루프의 유일한 현재 반복에서 조기에 종료합니다. 예를 들어, 3으로 나눌 수 없는 1부터 50까지의 각 정수에 대해 해당 제곱을 인쇄하려는 경우 해당 제곱이 400보다 크지 않는 한 다음과 같이 작성할 수 있습니다.

let mut n = 0;
while n < 50 {
  n += 1;
  if n % 3 != 0 {
    if n * n <= 400 {
      print!("{} ", n * n);
    }
  }
}

continue와 break를 사용해서 동일한  코드를 얻을 수 있습니다. 

 

let mut n = 0;
while n < 50 {
 n += 1;
 if n % 3 == 0 { continue; }
 if n * n > 400 { break; }
 print!("{} ", n * n);
}

위 두프로그램은 다음을 출력합니다:

1 4 16 25 49 64 100 121 169 196 256 289 361 400 .

 

이 두 버전에는 처음 세 줄이 동일합니다. 첫 번째 버전에서 n을 3으로 나눈 나머지가 0이 아닌 경우, 즉 숫자가 3으로 나누어 떨어지지 않으면 반복이 계속됩니다. 프로그램의 두 번째 버전에서는 숫자가 3의 배수이면 계속 문이 실행되므로 현재 반복은 즉시 종료되고 다음 반복에 도달합니다.

 

다음 반복이 다음 숫자를 처리하도록 하려면 해당 숫자를 증가시켜야 합니다. 따라서 이러한 incremental은 반복의 시작 부분에 놓입니다. continue 키워드를 사용하면 블록의 중첩 수준이 하나씩 줄어들기 때문에 가독성을 높일 수 있습니다. 또한 프로그램의 첫 번째 버전은 n의 제곱이 400보다 큰지 확인하고 한계를 초과하지 않은 경우에만 값을 출력합니다. 두 번째 버전은 숫자가 꾸준히 증가하는 경우 제곱이 400을 초과하면 다음 반복마다 초과한다는 사실을 고려합니다. 따라서 n의 제곱이 400을 초과하는 즉시 break 문이 실행되어 전체 루프에서 즉시 빠져 나오는 효과가 있습니다. break 키워드를 사용하면 continue 키워드와 유사하게 가독성도 높일 수 있습니다. 또한 여러 가지 쓸모없는 반복을 피하기 때문에 속도를 향상시킬 수 있습니다.

 

continue와 break

 

또 위 그림을 보면 continue와 break가 어디로 점프하는지를 확인할 수 있습니다

do-while구현

Rust자체는 while만 존재합니다. 다만 do-while이 필요한 경우들이 종종 있기에 이 부분은 아래와 같이 가져왔습니다. Rust는 블럭({ … })도 식으로 평가하기 때문에 while의 조건식에 블럭을 사용할 수 있는 것을 이용한 트릭입니다.

while {
    수행할 내용들;
    ...
    conditional; // 조건문
} {} // empty statement

 

반응형

'Rust' 카테고리의 다른 글

[Rust] Cargo 간단한 사용법  (0) 2023.09.05
[RUST] xlsxwriter  (0) 2023.07.24
[Rust] string과 str의 차이점은?  (0) 2022.10.11
[Rust] 벡터 (Vector)  (0) 2022.10.03
[Rust] 타입 추론 (Type Inference)  (0) 2022.09.16