Menu
Coddy logo textTech

트레이트란 무엇인가요?

Coddy Rust 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 29번째.

제네릭을 사용하면 어떤 타입과도 함께 작동하는 코드를 작성할 수 있지만, 때로는 타입이 특정한 동작을 수행할 수 있음을 보장해야 할 때가 있습니다. 이때 트레이트(traits)가 필요합니다.

트레이트(trait)는 타입이 반드시 구현해야 하는 메서드 집합을 정의합니다. 이를 하나의 계약이라고 생각하세요. 이 계약에 "서명"하는 모든 타입은 명시된 동작을 제공할 것을 약속합니다. 다른 언어에서 인터페이스(interface)를 사용해 보셨다면, 트레이트가 이와 유사한 목적을 수행한다는 것을 알 수 있습니다.

트레이트를 정의하는 방법은 다음과 같습니다:

trait Describable {
    fn describe(&self) -> String;
}

trait 키워드는 트레이트를 정의하며, 그 뒤에 트레이트의 이름이 옵니다. 중괄호 안에는 메서드 시그니처를 선언합니다. 즉, 본문 없이 이름, 매개변수, 반환 타입만 작성합니다. 시그니처 뒤의 세미콜론은 이것이 구현이 아니라 요구 사항임을 나타냅니다.

Describable 트레이트는 다음과 같이 명시합니다: "나를 구현하는 모든 타입은 반드시 자신에 대한 참조를 받고 String을 반환하는 describe 메서드를 제공해야 합니다." 이 트레이트는 메서드가 어떻게 작동하는지에는 신경 쓰지 않습니다. 그것은 이를 구현하는 각 타입에 달려 있습니다.

트레이트는 여러 다른 타입들이 동일한 트레이트를 구현할 때 강력해집니다. Book, Car, 그리고 Person은 모두 Describable이 될 수 있으며, 각각 고유한 설명을 제공합니다. 트레이트는 이들이 모두 이러한 공통된 기능을 공유하도록 보장합니다.

challenge icon

챌린지

쉬움

첫 번째 트레이트(trait)를 정의해 봅시다! 트레이트는 계약을 설정합니다. 즉, 해당 트레이트를 구현하는 모든 타입이 특정 동작을 제공할 것이라는 약속입니다. 여러분은 서로 다른 타입들이 각자의 요약을 제공하기 위해 구현할 수 있는 Summarizable 트레이트를 만들 것입니다.

코드를 두 개의 파일로 나누어 구성합니다:

  • summary.rs: summarize(&self) -> String이라는 단일 메서드 시그니처를 가진 Summarizable이라는 공개(public) 트레이트를 정의하세요. 트레이트 정의에서는 본문 없이 세미콜론으로 메서드 시그니처만 선언한다는 점을 기억하세요. 이는 Rust에게 "이 트레이트를 구현하는 모든 타입은 String을 반환하는 summarize 메서드를 반드시 제공해야 한다"라고 알리는 것입니다.
  • main.rs: summary 모듈을 가져오고 트레이트가 정의되었음을 확인하는 메시지를 출력하세요. 아직 트레이트를 구현하는 방법은 배우지 않았으므로(다음 레슨 내용입니다!), 여기서는 트레이트가 올바르게 컴파일되는지만 확인합니다.

메인 파일에서 트레이트 정의가 유효한지 확인하기 위해 다음 메시지를 출력하세요:

Summarizable trait defined successfully!

이 챌린지는 trait 키워드, 트레이트 이름, 구현부 없는 메서드 시그니처 선언 등 트레이트 정의 구문에만 집중합니다. 다음 레슨에서는 구조체가 이 트레이트를 구현하도록 만드는 방법을 배울 것입니다!

치트 시트

트레이트(trait)는 타입이 구현해야 하는 메서드 집합을 정의합니다. 이는 타입이 특정 동작을 제공하도록 보장하는 계약 역할을 합니다.

트레이트를 정의하려면 trait 키워드를 사용하고 그 뒤에 트레이트 이름과 메서드 시그니처를 작성합니다:

trait Describable {
    fn describe(&self) -> String;
}

트레이트의 메서드 시그니처에는 이름, 매개변수, 반환 타입이 포함되지만 본문은 없습니다. 세미콜론은 이것이 타입을 구현하기 위한 요구 사항임을 나타냅니다.

여러 서로 다른 타입이 동일한 트레이트를 구현할 수 있으며, 각 타입은 요구되는 메서드에 대해 고유한 구현을 제공합니다.

직접 해보기

mod summary;

fn main() {
    // TODO: trait가 정의되었다는 확인 메시지를 출력하세요
    // Expected output: "Summarizable trait defined successfully!"
    
}
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨