Programming

Rust기초 알기 - 5.2 열거형 정의와 사용

IT오이시이 2023. 7. 4. 05:44
728x90

 

Rust기초알기(5) - 구조체와 열거형

5.1 구조체 정의와 사용
5.2 열거형 정의와 사용
5.3 메서드와 연관 함수

[목차] Rust Programming - Rust 기초 알기 목차.Zip

#Rust프로그래밍  #Rust언어기초 #Rust기초문법 #Rust기초알기

 
 

Rust기초 알기 - 5.2 열거형 정의와 사용

 

열거형(enum)

 열거형(enum)을 사용하여 명명된 값들의 집합을 정의할 수 있습니다. 열거형은 비슷한 종류의 값들을 그룹화하고 패턴 매칭, 매치 가드, 메서드 구현 등 다양한 용도로 사용할 수 있습니다. 
 

열거형의 구조 정의

EnumName은 열거형의 이름이며, Variant1, Variant2, Variant3 등은 변종들의 이름입니다. 각 변종은 쉼표로 구분됩니다.

enum EnumName {
    Variant1,
    Variant2,
    Variant3,
    // ...
}

 
각 값은 열거형 내에서 고유한 이름을 가지며, 각 값은 열거형의 가능한 변형(또는 가지)을 나타냅니다.

enum Fruit {
    Apple,
    Banana,
    Orange,
}
  •  Fruit는 열거형의 이름이고, Apple, Banana, Orange는 열거형의 가지(변형)입니다.

 

열거형을 이용한 변수의 변형

열거형은 필요에 따라 연결된 여러 변형된 데이터를 가질 수 있습니다. 예를 들어, 열거형 EnumName의 변종 중 하나가 연결된 데이터를 가지도록 정의됩니다.

enum EnumName {
    Variant1,
    Variant2(u32),
    Variant3(String),
    // ...
}
  • Variant2는 u32 타입의 데이터와 연결되어 있고, Variant3는 String 타입의 데이터와 연결되어 있습니다.

 
열거형을 이용하면 IP address와 같이 IPv4와 IPv6에 대한 형식이 다른 데이터를 표기 할 수 있습니다.

// enum을 이용하여 IP address를 선언하는 예시
enum IpAddr {
      V4(String),
      V6(String),
}

let home = IpAddr::V4(String::from("127.0.0.1"));

let loopback = IpAddr::V6(String::from("::1"));

 

열거형 값 사용하여 변수 할당과 패턴매칭

열거형 값을 사용하기 위해서는 해당 값을 변수에 할당해야 합니다. 
예를 들어, 다음은 Fruit 열거형의 값을 변수에 할당하는 방법입니다:

enum Fruit {
    Apple(String),
    Banana(u32),
    Orange,
}
fn main() {
    // 열거형 값을 할당합니다.
    let favorite_fruit = Fruit::Apple;

    match favorite_fruit {
        Fruit::Apple => println!("I love apples!"),
        Fruit::Banana => println!("Bananas are great!"),
        Fruit::Orange => println!("Oranges are delicious!"),
    }
}

 

  •  favorite_fruit 변수에 Fruit::Apple 값을 할당합니다.
  •  match 표현식을 사용하여 favorite_fruit의 값을 패턴 매칭하여 해당하는 코드 블록을 실행 합니다.
  • match 표현식은 fruit 변수의 값과 각 열거형 가지를 비교합니다. 
  • 또, 매치 가드(Match Guard)라는 특정 조건을 추가하여 추가적인 분기 조건을 지정 할 수도 있습니다.

 

열거형과  변형 데이터 :  추가 정보를 포함

 
Rust의 열거형(Enum)은 각각의 가지(변형)에 데이터를 연결하여 추가 정보를 담을 수 있습니다. 
예를 들어, 다음은 Fruit 열거형의 각 가지에 연결된 데이터를 포함하는 예시

enum Fruit {
    Apple(String),
    Banana(u32),
    Orange,
}

fn main() {
    let apple_type = Fruit::Apple(String::from("Granny Smith"));
    let banana_count = Fruit::Banana(5);
    let orange = Fruit::Orange;

    match apple_type {
        Fruit::Apple(variety) => println!("I have a {} apple.", variety),
        Fruit::Banana(count) => println!("I have {} bananas.", count),
        Fruit::Orange => println!("I have an orange."),
    }
}

 

  •  Fruit::Apple은 문자열 타입의 데이터를 연결하고
  •  Fruit::Banana은 부호 없는 32비트 정수 타입의 데이터를 연결
  • match 표현식에서 패턴 매칭하여 해당하는 코드 블록을 실행할 때, 연결된 데이터를 가져와서 사용할 수 있습니다.

 

Rust의 열거형은 유연하고 강력한 데이터 구조를 구성

열거형의 가지마다 다른 형식의 데이터를 연결할 수 있기 때문에, 각 가지에 필요한 정보를 저장하고 해당 정보를 활용하여 다양한 동작을 수행할 수 있습니다.

enum Message {
    Quit,
    Move { x: i32, y: i32 },
    Write(String),
    ChangeColor(i32, i32, i32),
}

// Message는 열거형의 이름
//  Quit, Move, Write, ChangeColor는 각각의 가지를 정의 
//  각 가지는 서로 다른 형식의 데이터를 연결

fn main() {
    let message = Message::Move { x: 10, y: 20 };

    match message {
        Message::Quit => println!("Quit"),
        Message::Move { x, y } => println!("Move to x: {}, y: {}", x, y),
        Message::Write(text) => println!("Write: {}", text),
        Message::ChangeColor(r, g, b) => println!("Change color to RGB({}, {}, {})", r, g, b),
    }
}

 

  •  message 변수에 Message::Move { x: 10, y: 20 } 값을 할당
  •  match 표현식을 사용하여 message의 값과 열거형의 각 가지를 비교하여  해당하는 코드 블록을 실행
  •  Message::Move 가지에는 x와 y라는 이름의 데이터를 연결하고 있으며, 매칭할 때 해당 데이터를 사용할 수 있습니다.

 
 

열거형과 패턴 매칭

패턴 매칭은 Rust의 열거형 외에도 다른 타입에 대해서도 사용될 수 있으며, 조건에 따라 코드를 분기하고 제어 흐름을 관리하는 데 유용한 기능입

enum Fruit {
    Apple(String),
    Banana(u32),
    Orange,
}

fn main() {
    let fruit = Fruit::Banana(3);

    match fruit {
        Fruit::Apple(variety) => println!("I have an apple of variety: {}", variety),
        Fruit::Banana(count) if count > 1 => println!("I have {} bananas.", count),
        Fruit::Banana(_) => println!("I have a banana."),
        Fruit::Orange => println!("I have an orange."),
    }
}

// if count > 1 => : 매치 가드를 이용한 분기 코드

 

  •  match 표현식은 fruit 변수의 값과 각 열거형 가지를 비교합니다. 
  • 또 매치 가드(Match Guard)라는 특정 조건을 추가하여 추가적인 분기 조건을 지정할 수 있습니다.
  • 예시에서는 Fruit::Banana 가지에 대한 매치 가드를 사용하여 count 값이 1보다 큰 경우에만 코드를 실행하도록 지정하고 있습니다.
  • 또, 패턴 매칭은 와일드카드(_)를 사용하여 특정 가지나 값에 대해 일치하는지 확인할 수 있습니다.
  • 와일드카드는 해당 위치의 값을 무시하고자 할 때 사용됩니다.

 
 

(참고) 매치 가드(Match Guard)의 활용

매치 가드(Match Guard)는 Rust의 패턴 매칭(Pattern Matching)에서 추가적인 조건을 지정하여 분기를 제어하는 데 사용됩니다. 매치 가드를 활용하면 특정 패턴에 대한 매치를 더 세밀하게 제어하고, 특정 조건을 만족하는 경우에만 코드 블록을 실행할 수 있습니다.
매치 가드를 사용하면 패턴 매칭을 더 세밀하게 제어하고 다양한 조건을 검사할 수 있습니다. 숫자 범위, 조건식, 열거형의 특정 가지 등을 검사하여 코드를 분기하고 원하는 동작을 수행할 수 있습니다. 

1) 숫자 범위 검사:

매치 가드는 숫자 범위를 검사하여 매치를 제어할수 있으며, 다음 코드에서는 1부터 10까지의 범위에 속하는 값만 처리하는 패턴 매칭을 수행합니다.

fn main() {
    let number = 7;

    match number {
        n if (1..=10).contains(&n) => println!("Number {} is between 1 and 10.", n),
        _ => println!("Number is outside the range."),
    }
}
  • (1..=10)은 1부터 10까지의 범위를 나타냅니다.
  • contains 메소드를 사용하여 number 값이 해당 범위에 속하는지 확인하고, 
  • 매치 가드를 통해 해당하는 경우에만 코드를 실행합니다.

 

2) 조건식 검사:

매치 가드를 사용하여 특정 조건을 검사할 수도 있습니다. 예를 들어, 다음 코드에서는 문자열의 길이가 5보다 큰 경우에만 처리하는 패턴 매칭을 수행합니다.

fn main() {
    let text = String::from("Hello!");

    match text {
        s if s.len() > 5 => println!("Long text: {}", s),
        _ => println!("Short text."),
    }
}
  • len 메소드를 사용하여 문자열의 길이를 확인하고
  • 매치 가드를 통해 길이가 5보다 큰 경우에만 코드를 실행합니다

 
 

728x90
반응형