Rust 제어문: 조건문과 반복문
목차
조건문: if 표현식
Rust 역시 조건의 참거짓에 따라 다른 코드 블록을 실행하는 조건문이 있으며, if 키워드를 사용합니다.
기본적인 형태는 아래와 같습니다. 조건 부분을 따로 소괄호(()
)등으로 감싸지 않는 점이 눈에 똅니다.
Rust if
문 혹은 조건문에서 알아두어야 할 점은 다음 2가지입니다.
Rust의 조건문은 사실 if 표현식이다
대다수의 언어에서 if문은 선언문(Statement)로 다루어집니다. 하지만, Rust에서는 if 키워드를 사용하는 표현식입니다.
따라서, if 문의 결과로 값을 얻을 수 있으며, 이 대문에 변수에 대입할 때 사용할 수도 있습니다.
위 코드에서는 if 표현식의 결과를 변수 five_or_six
에 대입하고 있습니다. 마치 if
를 삼항연산자(?
)처럼 사용하고 있습니다.
그렇다면, 아래와 같은 코드는 정상적으로 작동할까요?
: cannot find value `number` in this scope
-/main.rs:5:24
|
5 | println!;
error
위 코드에서는 if
표현식에서 조건에 따른 각 결과가 다른 타입입니다. 다시 말해, 변수 five_of_six
의 타입 역시 확정할 수 없는 상황입니다.
이렇듯 if
표현식을 대입에 사용할 때는 모든 결과값의 타입이 일치해야 할니다.
조건 부분에는 bool
이외의 다른 타입을 사용할 수 없으며, 알아서 타입을 변환하지 않는다.
파이썬, JS 등 주류 언어에서는 Truthy
혹은 Falsy
값을 지원하는데요.
이는 불리언 값이 필요한 if문의 조건에 불리언이 아닌 타입을 입력해도 자연스럽게 해당 값을 불리언 값으로 인식하는 것을 의미합니다.
예를 들어, null
이면 false
, 12
이면 true
와 같이 말아죠.
하지만, Rust는 다른 타입의 값을 자동으로 불리언 타입으로 변환하지 않습니다.
따라서, 아래와 같이 코드를 작성하면 에러가 납니다.
: mismatched types
-/main.rs:4:8
|
4 | if number
error
반복문: 무조건 반복하는 loop
Rust의 loop
키워드는 while
이나 for
에 비해 생소한데요.
이 키워드는 반복문을 멈추는 조건 없이 프로그램이 깥날 때까지 계속 반복하도록 만들 때 사용합니다.
다른 언어에서 while true {}
와 같은 역할을 합니다.
loop
반복문의 형태는 다음과 같습니다.
그리고 loop
반복문 안에서는 반복을 멈추는 break
, 다음 반복으로 넘아가는 continue
키워드를 사용할 수 있습니다.
loop
도 역시 표현식
표현식을 기반으로 동작하는 Rust인 만큼, loop
키워드를 이용한 반복 역시 표현식으로 사용가능하며, 리턴값을 가질 수 있습니다.
리턴값을 명시할 때는 아리와 같이 break
키워드 뒤에 적어줍니다.
중첩된 loop에서 이름을 통해 제어하기
loop 블록 안에서 또 다시 lopp 블록을 사용하는 중첩 loop문을 사용한다면, 안쪽 loop문에서 사용하는 break
, continue
키워드는 안쪽 loop에 적용됩니다.
만약, 안쪽 loop 불록에서 바깥 loop 블록에 대해 제어하고 싶다면 미리 loop 블록에 이름을 명명할 수 있습니다.
위 코드에서 'counter:
코드를 추가해 바깥 loop에 counter
라는 이름을 붙였습니다. 이 때 홑따옴표('
) 하나를 앞에 붙여야 한다는 것을 기억해주세요.
그 다음, 해당 loop 블록을 제어하기 위해서 break 'counter;
문을 추가했습니다. 이 때도 역시 홑따옴표가 들어갑니다.
반복문: 조건에 따라 반복하는 while 문
Rust의 while
문은 다른 언어에서와 같이 조건이 참인 경우에 계속 반복합니다.
반복문: 컬렉션 타입을 순회하는 for 문
배열과 같이 여러 개의 값을 가진 컬렉션 타입 (혹은 컴파운드 타입)을 순회하며 인덱스 혹은 값을 가져오는 반복문에는 for
문을 사용하는 것이 좋습니다.
loop
혹은 while
문으로 사용할 때보다 인덱스 범휘를 벗어나는 등의 다양한 에러를 예방할 수 있습니다.
Rust의 for문은 for element in collection {}
형태로 동작하며, 아래와 같이 Range
타입과 효과적으로 사용할 수 있습니다.