Enum의 메서드
Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 15번째.
구조체와 마찬가지로, 열거형(enums)은 impl 블록에 정의된 메서드를 가질 수 있습니다. 이를 통해 열거형 타입에 직접 동작을 연결할 수 있으며, 통일된 인터페이스를 통해 서로 다른 변형(variants)들을 쉽게 다룰 수 있게 해줍니다.
이전 레슨의 Message 열거형에 메서드를 추가하는 방법은 다음과 같습니다:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
}
impl Message {
fn describe(&self) -> String {
match self {
Message::Quit => String::from("Quit signal"),
Message::Move { x, y } => format!("Move to ({}, {})", x, y),
Message::Write(text) => format!("Message: {}", text),
}
}
}
impl Message 블록은 구조체에서와 똑같이 작동합니다. 메서드는 열거형 인스턴스에 접근하기 위해 &self를 사용합니다. 메서드 내부에서는 match를 사용하여 어떤 배리언트를 다루고 있는지 확인하고 적절한 결과를 반환합니다.
어떤 변형(variant)을 가지고 있든 메서드를 호출하는 방식은 동일합니다:
fn main() {
let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
println!("{}", m1.describe()); // 종료 신호
println!("{}", m2.describe()); // (10, 20)으로 이동
}
이 패턴은 호출자가 어떤 변형(variant)을 가지고 있는지 알 필요가 없기 때문에 강력합니다. 호출자는 그저 메서드를 호출하기만 하면 되며, 열거형(enum)이 내부적으로 나머지를 처리합니다. 동작은 변형에 따라 달라지지만, 인터페이스는 일관되게 유지됩니다.
챌린지
쉬움현재 신호 상태를 설명하기 위해 메서드가 포함된 열거형(enum)을 사용하는 교통 신호등 시스템을 만들어 보겠습니다. 각 신호등 색상은 지속 시간에 대한 정보를 가지며, 메서드는 사람이 읽을 수 있는 설명을 제공합니다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
traffic.rs: 세 가지 변형(variant)을 가진 공개(public)TrafficLight열거형을 정의합니다:Red— 대기 시간을 나타내는u32를 가집니다.Yellow— 대기 시간을 나타내는u32를 가집니다.Green— 주행 시간을 나타내는u32를 가집니다.
String을 반환하는status메서드를 구현합니다. 메서드 내부에서match를 사용하여 각 변형을 처리하고 메시지에 지속 시간을 포함하세요.main.rs: traffic 모듈을 가져와서 각 신호등 변형의 인스턴스를 생성하고, 각각에 대해status메서드를 호출하여 설명을 출력합니다.
status 메서드는 정확히 다음 형식의 메시지를 반환해야 합니다:
Red의 경우:Stop for {seconds} secondsYellow의 경우:Caution for {seconds} secondsGreen의 경우:Go for {seconds} seconds
출력은 각 신호등의 상태를 별도의 줄에 표시해야 합니다:
Stop for {seconds} seconds
Caution for {seconds} seconds
Go for {seconds} seconds예를 들어, 빨간불이 30초, 노란불이 5초, 초록불이 25초인 경우 출력은 다음과 같습니다:
Stop for 30 seconds
Caution for 5 seconds
Go for 25 seconds세 가지 입력(빨간불 지속 시간, 노란불 지속 시간, 초록불 지속 시간)을 받게 됩니다.
치트 시트
열거형(Enums)은 구조체와 마찬가지로 impl 블록 내에 정의된 메서드를 가질 수 있습니다:
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
}
impl Message {
fn describe(&self) -> String {
match self {
Message::Quit => String::from("Quit signal"),
Message::Move { x, y } => format!("Move to ({}, {})", x, y),
Message::Write(text) => format!("Message: {}", text),
}
}
}
메서드는 열거형 인스턴스에 접근하기 위해 &self를 사용하며, 각 변리언트(variant)를 처리하기 위해 match를 사용합니다:
let m1 = Message::Quit;
let m2 = Message::Move { x: 10, y: 20 };
println!("{}", m1.describe()); // Quit signal
println!("{}", m2.describe()); // Move to (10, 20)
호출자는 변리언트에 관계없이 동일한 인터페이스를 사용하며, 열거형은 내부적으로 어떤 변리언트인지에 따라 동작을 처리합니다.
직접 해보기
mod traffic;
use traffic::TrafficLight;
fn main() {
// 지속 시간에 대한 입력을 읽습니다
let mut red_input = String::new();
std::io::stdin().read_line(&mut red_input).expect("Failed to read line");
let red_duration: u32 = red_input.trim().parse().expect("Invalid number");
let mut yellow_input = String::new();
std::io::stdin().read_line(&mut yellow_input).expect("Failed to read line");
let yellow_duration: u32 = yellow_input.trim().parse().expect("Invalid number");
let mut green_input = String::new();
std::io::stdin().read_line(&mut green_input).expect("Failed to read line");
let green_duration: u32 = green_input.trim().parse().expect("Invalid number");
// TODO: 입력받은 지속 시간을 사용하여 각 TrafficLight 변형의 인스턴스를 생성합니다
// TODO: 각 신호등에 대해 status 메서드를 호출하고 결과를 출력합니다
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.