IT’s Portfolio

[Rust] Start Rust (Day 12) - Enums and Pattern Matching [2] λ³Έλ¬Έ

Development Study/Rust

[Rust] Start Rust (Day 12) - Enums and Pattern Matching [2]

f1r3_r41n 2023. 2. 6. 14:11
728x90
λ°˜μ‘ν˜•

πŸ¦€ Rust Day 12

🏳️ Enums and Pattern Matching

2️⃣ match 흐름 μ œμ–΄ μ—°μ‚°μž

  • match ν‘œν˜„μ‹ : 흐름 μ œμ–΄ μ—°μ‚°μž(control flow operator)
  • 일련의 νŒ¨ν„΄κ³Ό 값을 비ꡐ해 μΌμΉ˜ν•˜λŠ” νŒ¨ν„΄μ— μ§€μ •λœ μ½”λ“œλ₯Ό 싀행함
  • νŒ¨ν„΄μ€ λ¦¬ν„°λŸ΄, λ³€μˆ˜ 이름, μ™€μΌλ“œμΉ΄λ“œλ₯Ό λΉ„λ‘―ν•΄ λ‹€μ–‘ν•œ κ°’μœΌλ‘œ ꡬ성 κ°€λŠ₯
  • 😎 μž₯점
    • νŒ¨ν„΄μ— λŒ€ν•œ ν’λΆ€ν•œ ν‘œν˜„λ ₯
    • μ»΄νŒŒμΌλŸ¬κ°€ λͺ¨λ“  경우의 μˆ˜κ°€ 처리되고 μžˆλŠ”μ§€ 확인할 수 있음
enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter,
}

fn value_in_cents(coin: Coin) -> u32 {
    match coin {
        Coin::Penny => {
            println!("Lucky Penny!");
            1
        },
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter => 25,
    }
}

fn main() {
    let coin = Coin::Penny;
    println!("{}", value_in_cents(coin));
}
// Result
// Lucky Penny!
// 1
  • μ—΄κ±°μžμ™€ 각 값에 ν•΄λ‹Ήν•˜λŠ” νŒ¨ν„΄μ„ match ν‘œν˜„μ‹μœΌλ‘œ μž‘μ„±ν•¨
  • match 와 if λŠ” μœ μ‚¬μ„±μ„ λ„μ§€λ§Œ ν•œ 가지 큰 차이점이 있음
    • if 문의 ν‘œν˜„μ‹μ€ λ°˜λ“œμ‹œ bool 을 리턴해야 ν•˜μ§€λ§Œ, match μ—°μ‚°μžμ˜ ν‘œν˜„μ‹μ€ μ–΄λ–€ νƒ€μž…μ˜ 값도 μ‚¬μš©ν•  수 있음
  • match ν‘œν˜„μ‹μ€ μ‹€ν–‰ μ‹œμ μ— 각 κ°€μ§€μ˜ νŒ¨ν„΄κ³Ό 결괏값을 μˆœμ„œλŒ€λ‘œ 비ꡐ함
    • νŒ¨ν„΄μ˜ κ°€μ§€λŠ” ν•„μš”ν•œ 만큼 μ •μ˜ν•  수 있음
    • 각 κ°€μ§€μ˜ μ—°κ΄€λœ μ½”λ“œλŠ” ν‘œν˜„μ‹ 이며 μΌμΉ˜ν•˜λŠ” κ°€μ§€μ˜ ν‘œν˜„μ‹μ„ μ‹€ν–‰ν•œ 결괏값 이 전체 match ν‘œν˜„μ‹μ˜ 리턴값 이 됨
  • νŒ¨ν„΄ κ°€μ§€μ˜ μ—°κ΄€λœ μ½”λ“œκ°€ 짧은 경우 μ—λŠ” ν†΅μƒμ μœΌλ‘œ μ€‘κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŒ
    • νŒ¨ν„΄ κ°€μ§€μ—μ„œ μ—¬λŸ¬ μ€„μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κ³ μž ν•œλ‹€λ©΄ μ€‘κ΄„ν˜Έ μ‚¬μš©

 

πŸ€” 값을 λ°”μΈλ”©ν•˜λŠ” νŒ¨ν„΄

  • match ν‘œν˜„μ‹μ˜ 가지 ν‘œν˜„μ‹μ€ νŒ¨ν„΄μ— μΌμΉ˜ν•˜λŠ” κ°’μ˜ 일뢀λ₯Ό 바인딩할 수 있음
#[derive(Debug)]
enum UsState {
    Alabama, Alaska, Arizona,
    Arkansas, California, Colorado,
    Florida, Kentucky, Ohio,
}

enum Coin {
    Penny,
    Nickel,
    Dime,
    Quarter(UsState),
}

fn value_in_cents(coin: Coin) -> u32 {
    match coin {
        Coin::Penny => {
            println!("Lucky Penny!");
            1
        },
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter(state) => {
            println!("State quarter from {:?}.", state);
            25
        },
    }
}

fn main() {
    let coin = Coin::Quarter(UsState::Ohio);
    println!("{}", value_in_cents(coin));
}
// Result
// State quarter from Ohio.
// 25
  • Coin μ—΄κ±°μžμ˜ 열것값 Quarter 에 UsState μ—΄κ±°μžλ₯Ό 좔가함
  • νŒ¨ν„΄μ— state λ³€μˆ˜λ₯Ό μΆ”κ°€ν•˜μ—¬ Coin::Quarter 열것값과 비ꡐ함
    • Coin::Quarter 열것값이 μΌμΉ˜ν•˜λ©΄ state λ³€μˆ˜μ—λŠ” 열것값이 μ €μž₯된 UsState μ—΄κ±°μžκ°€ 바인딩됨

 

πŸ€” Option<T> λ₯Ό μ΄μš©ν•œ 맀칭

  • Option<T> νƒ€μž…μ΄ Some(T) 값을 κ°€μ§ˆ λ•Œ κ·Έ μ•ˆμ— μ €μž₯된 T 값을 κΊΌλ‚΄ μ‚¬μš©ν•  수 있음
  • match ν‘œν˜„μ‹μ— 적용 κ°€λŠ₯함
fn plus_one(x: Option<i32>) -> Option<i32> {
    match x {
        None => None,
        Some(i) => Some(i + 1),
    }
}

fn main() {
    let five = Some(5);
    let six = plus_one(five);
    let none = plus_one(None);

    println!("{:?}\n{:?}", six, none);
}
// Result
// Some(6)
// None
  • λ³€μˆ˜μ— 값이 μ‘΄μž¬ν•˜λ©΄ κ·Έ 값에 1을 λ”ν•˜κ³  값이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ None 리턴

 

πŸ€” match λŠ” λ°˜λ“œμ‹œ λͺ¨λ“  경우λ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€

  • 러슀트의 νŒ¨ν„΄ 맀칭은 μ™„λ²½ν•΄μ•Ό 함
    • κ°€λŠ₯ν•œ λͺ¨λ“  경우λ₯Ό μ²˜λ¦¬ν•΄μ•Ό 함
    • Option<T> 의 경우 λŸ¬μŠ€νŠΈκ°€ None 에 ν•΄λ‹Ήν•˜λŠ” 경우λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ²˜λ¦¬ν•˜λ„λ‘ κ°•μ œν•¨μœΌλ‘œμ¨ μ–΄λ–€ 값이 λ„κ°’μž„μ—λ„ λΆˆκ΅¬ν•˜κ³  λ‹€λ₯Έ 값을 가지고 μžˆμ„ κ²ƒμœΌλ‘œ 잘λͺ» μƒκ°ν•˜λŠ” 일을 방지함

 

πŸ€” μžλ¦¬μ§€μ •μž _

  • λŸ¬μŠ€νŠΈλŠ” λͺ¨λ“  경우λ₯Ό λ‹€ μ²˜λ¦¬ν•˜κ³  싢지 μ•Šμ„ λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” νŒ¨ν„΄λ„ μ œκ³΅ν•¨
fn main() {
    let number = 6u8;
    match number {
        0 => println!("{}", number),
        2 => println!("{}", number),
        4 => println!("{}", number),
        6 => println!("{}", number),
        _ => (),
    }
}
// Result
// 6
  • λ³„λ„μ˜ μ²˜λ¦¬κ°€ ν•„μš”ν•˜μ§€ μ•Šμ„ λ•ŒλŠ” _ μžλ¦¬μ§€μ •μžλ‘œ λŒ€μ²΄ν•˜λ©΄ 됨
    • _ νŒ¨ν„΄μ€ λͺ¨λ“  값에 μΌμΉ˜ν•¨μ„ 의미
    • () 은 λ‹¨μˆœν•œ μœ λ‹›κ°’
  • match ν‘œν˜„μ‹μ€ 단 ν•œκ°€μ§€ 경우만 μ²˜λ¦¬ν•΄μ•Ό ν•  λ•Œ μ‚¬μš©ν•˜κΈ°μ—λŠ” λ‹€μ†Œ μž₯황함

 

3️⃣ if let 을 μ΄μš©ν•œ κ°„κ²°ν•œ 흐름 μ œμ–΄

  • if let ꡬ문은 if 와 let ꡬ문을 μ‘°ν•©ν•΄μ„œ μ—¬λŸ¬ 경우 쀑 ν•œ κ°€μ§€λ§Œ μ²˜λ¦¬ν•˜κ³ , λ‚˜λ¨Έμ§€λŠ” κ³ λ €ν•˜κ³  싢지 μ•Šμ„ λ•Œ μ²˜λ¦¬ν•˜λŠ” 문법
fn main() {
    let number = Some(3u8);
    match number {
        Some(3) => println!("Three!"),
        _ => (),
    }
}
// Result
// Three!
  • match ν‘œν˜„μ‹μ„ μ΄μš©ν•œ 처리 방법
fn main() {
    let number = Some(2u8);

    if let Some(3) = number {
        println!("Three!");
    }
}
// Result
// 
  • if let 문법을 μ΄μš©ν•œ 처리 방법
  • if let 문법은 ν•˜λ‚˜μ˜ νŒ¨ν„΄κ³Ό ν‘œν˜„μ‹μ„ λ“±ν˜Έ 기호λ₯Ό μ΄μš©ν•΄ 쑰합함
    • match ν‘œν˜„μ‹κ³Ό 같은 λ°©μ‹μœΌλ‘œ λ™μž‘ν•¨
  • ꡬ문에 μ§€μ •ν•œ νŒ¨ν„΄μ€ match ν‘œν˜„μ‹μ˜ 첫 번째 νŒ¨ν„΄μ— ν•΄λ‹Ήν•˜λ©° ν‘œν˜„μ‹μ€ κ·Έ νŒ¨ν„΄μ΄ μΌμΉ˜ν•  λ•Œ 싀행될 ν‘œν˜„μ‹μž„
  • match ν‘œν˜„μ‹μ΄ μ œκ³΅ν•˜λŠ” λͺ¨λ“  경우의 수λ₯Ό κ²€μ‚¬ν•˜λŠ” κΈ°λŠ₯을 ν™œμš©ν•  μˆ˜λŠ” μ—†μŒ
  • if let 문법은 주어진 값에 λŒ€ν•΄ ν•˜λ‚˜μ˜ νŒ¨ν„΄λ§Œ κ²€μ‚¬ν•˜κ³  λ‚˜λ¨Έμ§€ 값은 λ¬΄μ‹œν•˜λŠ” match ν‘œν˜„μ‹μ„ 더 μ‰½κ²Œ μ‚¬μš©ν•˜κΈ° μœ„ν•œ 문법적 편의μž₯치(syntax sugar) 라고 생각
fn main() {
    let coin = Coin::Penny;
    let mut count = 0;
    match coin {
        Coin::Quarter(state) => println!("State quarter from {:?}.", state),
        _ => {
            count += 1;
            println!("{}", count);
        },
    }
}
// Result
// 1
  • if let ꡬ문의 else ꡬ문에 ν•΄λ‹Ήν•˜λŠ” match ν‘œν˜„μ‹μ˜ _ νŒ¨ν„΄
fn main() {
    let coin = Coin::Penny;
    let mut count = 0;

    if let Coin::Quarter(state) = coin {
        println!("State quarter from {:?}.", state);
    } else {
        count += 1;
        println!("{}", count);
    }
}
  • if let ꡬ문에 else ꡬ문을 ν¬ν•¨ν•œ μ½”λ“œ
  • ν”„λ‘œκ·Έλž¨μ˜ λ‘œμ§μ„ ν‘œν˜„ν•˜λŠ” 데 μžˆμ–΄ match ν‘œν˜„μ‹μ΄ λ„ˆλ¬΄ μž₯ν™©ν•˜κ²Œ 보인닀면 if let ν‘œν˜„μ‹λ„ μ œκ³΅λœλ‹€λŠ” 점을 κΈ°μ–΅

 

Summary

  • μ‚¬μš©μž μ •μ˜ νƒ€μž… 생성
    • λ‚˜μ—΄λœ κ°’ 쀑 ν•˜λ‚˜λ₯Ό ν‘œν˜„ν•˜λŠ” μ—΄κ±°μž
  • νƒ€μž… μ‹œμŠ€ν…œμ΄ μ œκ³΅ν•˜λŠ” 였λ₯˜ 방지 κΈ°λŠ₯
    • ν‘œμ€€ 라이브러리의 Option<T> νƒ€μž…
  • 열것값이 λ‹€λ₯Έ 데이터λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμ„ λ•Œ κ°’ μΆ”μΆœ
    • match ν‘œν˜„μ‹
    • if let ν‘œν˜„μ‹
728x90
λ°˜μ‘ν˜•
Comments