traits는 특정 타입이 가져야 할 기능의 집합을 정의하는 Rust의 추상화 매커니즘이다. 다른 언어의 interface와 비슷한 개념으로 이해할 수 있다.
이는 특정 타입이 구현해야 하는 메서드의 시그니처를 선언 할 수 있으며, 이러한 메서드들의 기능은 구현되어 있지 않다. 대신 해당 'traits'를 구현하는 타입들은 요구 사항에 맞는 메서드를 직접 구현해야 한다.(impl)
Rust를 사용할때 이미 traits를 많이 접하고 있었는데 Debug
, Copy
, Clone
또한 traits이다.
use std::fmt::Debug;
#[derive(Debug)] // impl
struct MyStruct {
name: String,
}
fn print_something<T:Debug>(input:T) {
println!("{input:?}");
}
fn main() {}
Debug traits 사용의 예시
앞서 서술한대로 impl을 구현할때에는 만들어 놓은 traits를 토대로 implement를 하면 된다는 것이다.
struct Dog {
name: String
}
trait Canine {
fn bark(&self) {
println!("멍멍!")
}
fn run(&self) {
println!("열심히 뛰는 중!")
}
}
impl Canine for Dog {}
fn main() {
let my_animal = Dog {name: "Lucky".to_string()};
my_animal.bark();
my_animal.run();
}
Dog라는 Struct를 만들고 Canine traits를 생성했다.
bark와 run에서 이미 함수를 구현했는데 default implement
라고 하며 traits는 작성하는 개발자의 마음대로 구현할 수 있기 때문이다.
위에서 이미 함수가 구현되었기 때문에 impl에는 아무것도 전달하지 않았다.
struct Dog {
name: String
}
trait Canine {
fn bark(&self) {
println!("멍멍!")
}
fn run(&self) {
println!("열심히 뛰는 중!")
}
}
impl Canine for Dog {
fn bark(&self) {
println!("멈머~~");
}
}
fn main() {
let my_animal = Dog {name: "Lucky".to_string()};
my_animal.bark();
my_animal.run();
}
우리집 강아지는 특별해서 짖는 소리가 조금 다르다고 하자.
impl에 bark의 print를 변경하면 어떻게 될까?
impl에 구현된 bark로 출력이 되는 것을 확인할 수 있다.
use std::fmt::{self, write};
#[derive(Debug)]
struct Cat {
name: String,
age: u8,
}
impl fmt::Display for Cat {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let name = &self.name;
let age = self.age;
write!(f, "우리집 고양이 이름은 {name}이고 나이는 {age}입니다.")
}
}
fn main() {
let mr_mantle = Cat {
name: "Reggie Mantle".to_string(),
age: 4
};
println!("{mr_mantle}")
}
이런 식으로 Display를 impl 할 수 있다.
(name은 String이니까 소유권 가져오지 않고 참조만!)
bark
라는 특성은 무엇인가를 짖을 수 있다는 '능력'이다. 하지만 실제로 어떻게 짖을지는 정해지지 않았으며, 그저 짖을 수 있다는 사실만을 가지고 있을 뿐이다.
my_animal
은 bark
의 능력을 가지게 된다. 그렇다면 my_animal
은 bark
특성을 구현한 것이다. bark
능력을 가진 이 변수는 실제로 어떻게 짖을 것인지 구체적으로 구현해야 한다.
예를 들어 멍멍
, bow bow
, 왈왈
등 여러가지를 출력하는 것이 될 것이다.
traits는 능력을 가진 목록이고, impl은 능력을 가진 대상을 나타낸다!
traits라는 청사진이 주어져있고, impl은 그것을 가진 사람들 혹은 대상이라고 생각하니 이해가 조금 되는 것 같다..
정말 좋은 정보 감사합니다!