강좌13-Match

1 분 소요

match

match는 javascript의 switch 와 유사한 기능을 가지고 있습니다.
즉, 여러 조건들이 각각의 경우에 따라 각자 처리됩니다.

다시 말해, 여러개의 if를 모아놓은 것이라 보면 됩니다.
다만, javascript의 switch와 다른 점은 조건은 범위가 될 수 없다는 점 입니다.

형식은 다음과 같습니다.

match 변수 {
  조건 => 실행,
  _ => 실행
}

여기에서 _ (placeholder)는 switch의 default와 같이 조건에 맞지 않는 나머지를 의미합니다.

기본 사용법을 예제로 풀어보겠습니다.

기본형

fn main() {
  let a = 1;
  let result = match a {
    1 => "one",
    2 => "two",
    _ => "many"
  };
  
  println!("{}", result);
}

//결과
one

Option과 연결

만일 match에 Option이 조건식으로 들어가면 어떻게 해야하는지 알아보겠습니다.

Option은 반드시 Some과 None이 포함되어야 하므로 match에서도 반드시 포함되어야 합니다.

  fn opt(val: Option<i8>) {
    match val {
      None => println!("None"),
      Some(i) => {
        println!("Some {}", i);
        i
      }
    }
  }

만일 None을 추가하지 않으면 에러가 발생합니다.

Enum과 연결

match의 장점은 바로 enum과의 연결에 있다고 볼 수 있습니다.
설정된 Enum에 값을 설정할 수 있으므로 비로소 Enum에 색을 입힐 수 있게 되었습니다.

예제로 이를 확인해 보겠습니다.

enum Number {
    One,
    Two,
    Three
}

fn count(num: Number) -> u8 {
    match num {
        Number::One => 1,
        Number::Two => 2,
        Number::Three => 3 
    }
}

확장된 Enum과 연결

Enum에 여러 다른 형을 추가할 수 있는데 match에서도 이를 활용하여 처리할 수 있습니다.

enum Alphabet {
  A,
  B,
  C
}
enum Number {
    One,
    Two,
    Three(Alphabet)
}

fn count(num: Number) -> u8 {
    match num {
        Number::One => 1,
        Number::Two => 2,
        Number::Three(word) => {
          println!("alphabet is {}", word);
          3
        }
    }
}

fn main() {
    let a = Number::Three(Alphabet::A);

    let result = count(a);
    println!("{}", result);
}

댓글남기기