traits, impl

이정후·2023년 7월 18일
0

Rust

목록 보기
4/13

traits

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 사용의 예시

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이니까 소유권 가져오지 않고 참조만!)

traits와 impl

traits => 특성

bark 라는 특성은 무엇인가를 짖을 수 있다는 '능력'이다. 하지만 실제로 어떻게 짖을지는 정해지지 않았으며, 그저 짖을 수 있다는 사실만을 가지고 있을 뿐이다.

impl => 구현

my_animalbark의 능력을 가지게 된다. 그렇다면 my_animalbark 특성을 구현한 것이다. bark 능력을 가진 이 변수는 실제로 어떻게 짖을 것인지 구체적으로 구현해야 한다.
예를 들어 멍멍, bow bow, 왈왈 등 여러가지를 출력하는 것이 될 것이다.

traits는 능력을 가진 목록이고, impl은 능력을 가진 대상을 나타낸다!

traits라는 청사진이 주어져있고, impl은 그것을 가진 사람들 혹은 대상이라고 생각하니 이해가 조금 되는 것 같다..

profile
꾸준하게

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

정말 좋은 정보 감사합니다!

답글 달기