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보다 큰 경우에만 코드를 실행합니다
'Programming' 카테고리의 다른 글
Rust기초 알기 - 6.3 트레이트의 상속과 구현 (63) | 2023.07.13 |
---|---|
Rust기초 알기 - 6.1 트레이트 개념과 사용법 (60) | 2023.07.11 |
Rust기초 알기 - 5.3 메서드와 연관 함수 (60) | 2023.07.06 |
Rust기초 알기 - 5.1 구조체 정의와 사용 (50) | 2023.07.02 |
Rust기초 알기 - 4.4 소유권과 메모리 관리 (12) | 2023.06.30 |
Rust기초 알기 - 4.3 소유권 이전과 복사 (6) | 2023.06.29 |
Rust기초 알기 - 4.2 소유권 규칙 (7) | 2023.06.28 |