Menu
Coddy logo textTech

기본 구현

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

지금까지 우리가 정의한 모든 trait method는 본문이 없는 요구 사항인 서명뿐이었습니다. 하지만 trait를 구현하는 대부분의 타입이 동일한 로직을 사용한다면 어떨까요? Rust에서는 trait 정의에 직접 default implementation을 제공할 수 있습니다.

메서드 시그니처를 세미콜론으로 끝내는 대신, 본문을 추가합니다:

trait Greet {
    fn greet(&self) -> String {
        String::from("Hello there!")
    }
}

이제 impl 블록에 어떤 코드도 작성하지 않아도 Greet를 구현하는 모든 타입이 자동으로 이 method를 얻습니다:

struct Guest;

impl Greet for Guest {}

let visitor = Guest;
println!("{}", visitor.greet());  // 안녕하세요!

비어 있는 impl Greet for Guest {}가 유효한 이유는 trait이 이미 동작을 제공하기 때문입니다. 이 struct는 단순히 trait을 "선택하여 사용"하고 기본 method를 무료로 받습니다.

이 패턴은 대부분의 경우에 작동하는 공유 동작을 정의하고 싶을 때 유용합니다. 다른 동작이 필요한 타입은 default를 재정의할 수 있으며(다음에 배우게 됩니다), 표준 동작으로 충분한 타입은 같은 내용을 반복해서 작성할 필요가 없습니다.

challenge icon

챌린지

쉬움

기본 구현의 강력한 기능을 활용해 알림 시스템을 만들어 보겠습니다! 기본 동작을 즉시 제공하는 트레이트를 만들어, 타입이 반복적인 코드를 작성하지 않고도 이를 사용할 수 있도록 합니다.

코드를 세 개의 파일로 구성합니다:

  • notifiable.rs: notify(&self) -> String 메서드와 기본 구현을 포함하는 public Notifiable 트레이트를 정의합니다. 기본 구현은 "You have a new notification!"을 반환해야 합니다. 이 트레이트를 구현하는 모든 타입은 impl 블록에 아무것도 작성하지 않아도 자동으로 이 동작을 받습니다.
  • alerts.rs: 트레이트를 구현하는 두 개의 간단한 public unit 구조체를 만듭니다:
    • EmailAlert: 빈 impl 블록으로 Notifiable을 구현합니다 (기본 구현 사용)
    • SystemAlert: 역시 빈 impl 블록으로 Notifiable을 구현합니다 (기본 구현 사용)
    두 구조체 모두 메서드 본문을 직접 작성하지 않아도 기본 알림 메시지를 자동으로 받습니다!
  • main.rs: 모듈을 하나로 모으고 두 알림 타입이 동일한 기본 동작을 공유하는 방식을 보여 줍니다. 두 구조체의 인스턴스를 만들고 해당 notify 메서드를 호출합니다.

main 파일에서 EmailAlertSystemAlert을 만들고, 각각의 알림을 별도의 줄에 출력합니다.

출력 결과는 다음과 같아야 합니다:

You have a new notification!
You have a new notification!

두 타입이 동일한 출력을 생성하는 것을 확인하세요. 이것이 바로 기본 구현의 장점입니다! 어느 구조체도 notify 메서드에 대한 코드를 작성할 필요가 없었지만, 둘 다 완전히 동작하는 알림 기능을 갖추게 되었습니다. 다음 레슨에서는 타입에 사용자 지정 동작이 필요할 때 이러한 기본 구현을 재정의하는 방법을 알아보겠습니다.

직접 해보기

mod notifiable;
mod alerts;

use notifiable::Notifiable;
use alerts::{EmailAlert, SystemAlert};

fn main() {
    // TODO: EmailAlert의 인스턴스를 생성하세요
    
    // TODO: SystemAlert의 인스턴스를 생성하세요
    
    // TODO: Print the notification from EmailAlert
    
    // TODO: Print the notification from SystemAlert
}
quiz icon실력 점검

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

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

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