Menu
Coddy logo textTech

Enum의 메서드

Coddy Rust 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 15번째.

구조체와 마찬가지로 열거형에도 impl 블록에서 메서드를 정의할 수 있습니다. 이를 통해 열거형 타입에 직접 동작을 연결할 수 있으므로, 통합된 인터페이스를 통해 다양한 variant를 쉽게 다룰 수 있습니다.

이전 레슨의 Message enum에 메서드를 추가하는 방법은 다음과 같습니다:

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 블록은 구조체에서와 정확히 동일하게 작동합니다. 메서드는 enum 인스턴스에 액세스하기 위해 &self를 받습니다. 메서드 내부에서는 match를 사용하여 어떤 variant를 처리하고 있는지 확인하고 적절한 result를 반환합니다.

어떤 variant를 가지고 있든 method를 호출하는 방식은 동일합니다:

fn main() {
    let m1 = Message::Quit;
    let m2 = Message::Move { x: 10, y: 20 };
    
    println!("{}", m1.describe());  // 종료 신호
    println!("{}", m2.describe());  // (10, 20)으로 이동
}

이 패턴은 호출자가 어떤 variant를 가지고 있는지 알 필요가 없기 때문에 강력합니다. 호출자는 그저 method를 호출하면 되고, enum이 나머지 처리를 내부적으로 담당합니다. 동작은 variant에 따라 달라지지만, 인터페이스는 일관되게 유지됩니다.

challenge icon

챌린지

쉬움

메서드를 사용하여 현재 신호 상태를 설명하는 enum을 활용하는 traffic light 시스템을 만들어 봅시다. 각 신호등 색상은 지속 시간을 나타내는 정보를 가지며, method는 사람이 읽을 수 있는 설명을 제공합니다.

코드를 구성하기 위해 두 개의 파일을 만듭니다:

  • traffic.rs: 세 가지 variants를 가진 public TrafficLight enum을 Define합니다:
    • Red: 기다려야 하는 seconds를 나타내는 u32를 보유합니다.
    • Yellow: 기다려야 하는 seconds를 나타내는 u32를 보유합니다.
    • Green: 진행할 seconds를 나타내는 u32를 보유합니다.
    그런 다음 신호등을 설명하는 String을 반환하는 status method를 Implement합니다. method 내부에서 match를 사용하여 each variant를 handle하고 메시지에 지속 시간을 포함합니다.
  • main.rs: traffic 모듈을 가져오고, 각 신호등 variant의 instances를 만들고, 각 신호등에서 status method를 Call하여 설명을 print합니다.

status method는 다음과 같은 정확한 형식의 메시지를 반환해야 합니다:

  • Red의 경우: Stop for {seconds} seconds
  • Yellow의 경우: Caution for {seconds} seconds
  • Green의 경우: Go for {seconds} seconds

출력에는 각 신호등의 status가 각각 별도의 줄에 표시되어야 합니다:

Stop for {seconds} seconds
Caution for {seconds} seconds
Go for {seconds} seconds

예를 들어, Red 신호등이 30 seconds 동안 켜지고 Yellow가 5 seconds, Green이 25 seconds 동안 켜지는 경우 출력은 다음과 같습니다:

Stop for 30 seconds
Caution for 5 seconds
Go for 25 seconds

세 가지 입력을 받습니다: Red 신호등 지속 시간, Yellow 신호등 지속 시간, Green 신호등 지속 시간입니다.

직접 해보기

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 메서드를 호출하고 결과 출력
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 Rust 컴파일러