[Rust] 정적 디스패치
러스트의 트레잇은 기본적으로 다른 언어의 인터페이스와 유사한 기능이나, 성능면에 있어서 더 유리한 부분을 어느정도 갖고 있다.
보통 어떤 인터페이스를 구현하거나, 다른 클래스를 상속받은 타입은 필연적으로 좀더 무거워질 수밖에 없다.
내부에 가상함수테이블을 두고 동적바인딩을 수행할 필요가 있기 때문이다.
하지만 러스트에서는 이러한 처리가 상황에 따라 다르게 발생한다.
컴파일타임 처리가 가능한 형태에서는, 서브타입이라도 그러한 것들은 생략하도록 최적화가 발생하기 때문이다.
일단 예시를 보자.
여기 매우 심플한 트레잇이 하나 있다.

foo 메서드는 String 타입의 값을 반환한다.
이걸 구현하는 타입은 자기 자신의 값을 문자열로 변환해서 반환할 것이다.
이걸 i32와 f32에 구현한다.


그럼 이렇게 오버로딩한것처럼 사용이 가능하다.


저렇게 호출을 한다면, 저 do_something 함수는 컴파일타임에 아래와 같이 변환된다.

이게 정적 디스패치다.
근데 저기서 이제 값으로 전달한 인자를 참조형으로 바꾸거나, Box 등을 쓴다면 기존의 구조와 동일한 동적 디스패치로 처리하게 된다.
이에 대한건 차후 정리해서 포스팅하겠다.
참조
https://doc.rust-lang.org/1.30.0/book/first-edition/trait-objects.html#representation