[Rust/러스트] 패턴 매칭(match, if let) 정리

2022. 2. 21. 09:00Programming Language/Rust

반응형

■ 패턴 매칭

패턴 매칭에는 match 연산자와 if let 문법이 있습니다.

match 연산자는 다양한 조건을 처리할 때 주로 사용되며, if let 문법은 간결한 흐름을 통해 하나의 패턴만 매칭시키고 나머지는 무시하고 싶을 때 사용됩니다.


◆ match

match는 리터럴 값, 변수명 등 다양한 패턴으로 구성될 수 있습니다.

Java, Go 등에서 자주 사용되는 switch 문법과 유사한 기능을 제공합니다.

match의 패턴은 조건이 될 수 있는 모든 항목을 정의해야 합니다. 만약 패턴 조건에서 무시해도 되는 항목에 경우 변경자(_)를 통해 일괄적으로 무시할 수 있습니다.

1) 반환값이 없는 match

#[derive(Debug)]
enum Gender{
    Male,
    Female,
}

#[derive(Debug)]
enum Info{
    Name(String),
    Age(u32),
    Location{x : i32, y : i32},
    Gender(Gender)
}

fn show_info(info : Info) {
    match info {
        Info::Name(s) => println!("Name: {}", s),
        Info::Age(u) => println!("Age : {}", u),
        Info::Location{x, y} => println!("Location x : {}, y : {}", x, y),
        Info::Gender(gender) => println!("Gender : {:?}", gender)
    }
}

fn main(){
    show_info(Info::Name(String::from("Hyunmin Han")));
    show_info(Info::Age(29));
    show_info(Info::Location{x : 130, y : 80});
    show_info(Info::Gender(Gender::Male));
}

▶ 출력 결과

Name: Hyunmin Han
Age : 29
Location x : 130, y : 80
Gender : Male

2) 반환값이 있는 match

#[derive(Debug)]
enum Gender{
    Male,
    Female,
}

#[derive(Debug)]
enum Info{
    Name(String),
    Age(u32),
    Location{x : i32, y : i32},
    Gender(Gender)
}

fn show_info(info : Info) -> String {
    match info {
        Info::Name(s) => {
            println!("Name: {}", s);
            String::from("Name")
        },
        Info::Age(u) => {
            println!("Age : {}", u);
            String::from("Age")
        },
        Info::Location{x, y} => {
            println!("Location x : {}, y : {}", x, y);
            String::from("Location")
        },
        Info::Gender(gender) => {
            println!("Gender : {:?}", gender);
            String::from("Gender")
        }
    }
}

fn main(){
    let s = show_info(Info::Name(String::from("Hyunmin Han")));
    println!("Select Info : {}\n", s);
    let s = show_info(Info::Age(29));
    println!("Select Info : {}\n", s);
    let s = show_info(Info::Location{x : 130, y : 80});
    println!("Select Info : {}\n", s);
    let s = show_info(Info::Gender(Gender::Male));
    println!("Select Info : {}\n", s);
}

▶ 출력 결과

Name: Hyunmin Han
Select Info : Name

Age : 29
Select Info : Age

Location x : 130, y : 80
Select Info : Location

Gender : Male
Select Info : Gender

3) ( _ ) 변경자 활용

#[derive(Debug)]
enum Gender{
    Male,
    Female,
}

#[derive(Debug)]
enum Info{
    Name(String),
    Age(u32),
    Location{x : i32, y : i32},
    Gender(Gender)
}

fn show_info(info : Info) {
    match info {
        Info::Name(s) => println!("Name: {}", s),
        _ => println!("Something")
    }
}

fn main(){
    show_info(Info::Name(String::from("Hyunmin Han")));
    show_info(Info::Age(29));
    show_info(Info::Location{x : 130, y : 80});
    show_info(Info::Gender(Gender::Male));
}

▶ 출력 결과

Name: Hyunmin Han
Something
Something
Something

◆ if let

if let은 match 와 달리 하나의 패턴만 매칭시키고, 나머지 패턴은 무시하고 싶을 때 주로 사용됩니다.

#[derive(Debug)]
enum Info{
    Name(String),
    Age(u32),
}

fn show_name(info : Info) -> String {
    if let Info::Name(name) = info{
        name
    }else{
        String::from("Something")
    }
}

fn main(){
    // if let 조건 예시 데이터 셋팅
    let s = show_name(Info::Name(String::from("Hyunmin Han")));
    println!("Name : {}", s);

    // else 조건 예시 데이터 셋팅
    let s = show_name(Info::Age(29));
    println!("Name : {}", s);
}

▶ 출력 결과

Name : Hyunmin Han
Name : Something
반응형