trait
을 선언 시 trait bound를 설정할 수 있는 문법을 보고 정리하고자 작성한다.
trait MyTrait {
fn test_func(&self);
}
struct MyTest {}
impl MyTrait for MyTest {
fn test_func(&self) {
println!("안녕하세요");
}
}
fn main() {
let my_test = MyTest{};
my_test.test_func();
}
위 코드는 일반적인 trait
을 구현한 구조체 예시이다.
trait
를 선언 시 해당 트레이트를 구현할 타입에 대해 조건을 걸 수 있다. 아래 코드를 보자.
trait MyTrait: Clone {
fn test_func(&self);
}
struct MyTest {}
impl MyTrait for MyTest {
fn test_func(&self) {
println!("안녕하세요");
}
}
위 코드를 컴파일 시 에러가 발생한다.
the trait bound
MyTest: Clone
is not satisfied
the traitClone
is not implemented for `MyTest
Clone
trait를 MyTest
가 구현하지 않았다는 것이다. 즉, Clone
을 구현한 타입에 대해서만 MyTrait
트레이트를 구현할 수 있다는 의미이다.
trait MyTrait: Clone {
fn test_func(&self);
}
#[derive(Clone)]
struct MyTest {}
impl MyTrait for MyTest {
fn test_func(&self) {
println!("안녕하세요");
}
}
위와 같이 코드를 수정하면 문제없이 컴파일이 된다.
트레잇 바운드를 적절히 활용하면, 코드의 가독성뿐만 아니라 컴파일 타임에서의 타입 체크로 인해 실수나 버그를 줄일 수 있다.
이를 활용해 깔끔하고 안전한 코드를 작성할 수 있다. rust
가 강력한 타입 시스템을 가진다는 것을 다시 한번 깨달았다.