-
if let 구문 이해하기 [ TIL / Rust ]웹개발/Rust 2023. 9. 18. 17:36
배경
아직도 Rust 언어로 구현된 프로그램을 봤을 때 생소한 표현을 확인하게 되는 경우가 많다. 사실 이번
if let
구문 같은 경우는 분명 Rust Book에서도 확인했었던 문법인데 사용하는 방식이 낯설었다. 이번 기회에 이 문법에 대해서는 정확하게 짚고 넘어가기 위해서 정리해본다.match
if let
은 사실match
문법하고 밀접한 관련이 있다.match
는 사실 C언어에서switch
문법과 많이 닮아있다. 예제를 보며 간단히 살펴보도록 하겠다.enum Transfortation { Taxi, Bus, Subway, Train, Airplane } // calculate cost let vehicle = Transfortation::Taxi; let cost = match vehicle { Transfortation::Taxi => 30, Transfortation::Bus => 10, Transfortation::Subway => 8, Transfortation::Train => 12, Transfortation::Airplane => 60, }; println!("cost: {}", cost);
교통수단 택시, 버스, 지하철, 기차, 비행기를 열거형으로 작성해놓았다. 그리고 각 탈 것마다
match
를 통해 비용을 나타내는 정수 값에 대응하게 만들었다. 기본적으로 어떤 패턴과 값이 매칭하여 흐름을 제어하는 연산을 하기 위해서는match
를 사용하게 된다. 번역된 Rust Book에서는 match를 연산자라고 소개하고 있는데, 아무래도 분기처리되어 매칭되는 값이 반환되기 때문에 그런게 아닐까 생각하고 있다.if let
match
구문을 사용한 위 예제를 확인해보면Transfortation
에 지정되어 있는 모든 교통수단에 대하여 분기 처리가 되어 있는 것을 확인할 수 있다. 만약 저기서 하나라도 분기처리가 안 되어있다면 Rust는 컴파일하는 단계에서부터 에러를 낸다._
표현식을 사용하여 나머지 분기 처리를 한 번에 할당할 수 있는 방법이 따로 마련되어 있다.match
를 통해 모든 경우를 분기 처리하게 만드는 방식은 Rust에서 추구하는 안정성을 위한 것 같다.하지만
if let
문법이 존재하기도 한다. Rust Book에서는 "하나의 패턴만 매칭 시키고 나머지 경우는 무시하는 값을 다루는 덜 수다스러운 방법을 제공"하고 있다고 명시한다. 만약 Taxi만 비용을 계산하고 싶고 다른 경우는 무시한다고 생각하고match
를 이용해서 코드를 작성해보자.let cost = match vehicle { Transfortation::Taxi => 30, _ => (), };
이를
if let
문법을 이용해서 작성하면 다음의 예시로 나타날 것이다.if let Transfortation::Taxi = vehicle{ println!("cost: 30"); }
하지만
if let
문법은 코딩을 했다고 하는 사람들에게는 조금 이해하기 불편한 사항이 있다. 특히JavaScript
에서는let
이 새로운 변수와 변수명을 선언할 때 사용하는 문법이고,=
이라는 연산은 우에서 좌로 값이 할당되는 연산이다. 이 때문에 자칫Transforation::Taxi
에vehicle
의 값이 할당되고 있는 것처럼 이해될 수도 있다.if let
은 하나의 문법처럼match
를 사용방식을 통해 이용하는 것이 더욱 쉬운 것 같다.