ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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::Taxivehicle의 값이 할당되고 있는 것처럼 이해될 수도 있다. if let은 하나의 문법처럼 match를 사용방식을 통해 이용하는 것이 더욱 쉬운 것 같다.

Designed by Tistory.