1. trait A가 객체로 만들수 없게되는 조건은? (Box[A], &dyn A등)
맴버함수에 제네릭이 들어가거나 &self나 &mut self가 아닌 함수가 들어갈때(self 혹은 self가 없는 정적함수)
그리고 Self: Sized 조건이 붙거나 맴버함수에서 Self 타입을 쓸때 object-safe하지 못한 trait가 되어 객체로 만들수 없습니다
간단하게 말하면 저것들이 포함되면 동적으로 디스페치할수 없는 trait입니다
2. 자신의 코드에서 struct A가 trait Foo를 구현시키게 하기위해 필요한 조건은?
A 혹은 Foo가 지금 라이브러리에 포함된 타입이여야 합니다 전혀 다른 타입들은 건드릴수 없습니다
하지만 A나 Foo의 타입인자에 자신의 타입이 포함돼있는 경우의 구현은 가능합니다
예를들어
이건 안되지만
이런건 됩니다
주의할점은 이 조건을 만족해도 구현들이 충돌할 경우에는 불가능합니다
3. 다음 foo 함수의 반환값은 가상호출을 사용하는가?
impl Foo는 Foo를 구현한 무언가를 반환한다는 뜻이며
trait를 편리하게 반환시키기 위해 사용됩니다
컴파일할때 fn foo() -> A 로 치환되며 가상호출은 필요없습니다
4. &는 왜 T가 Sync여야만 Send를 구현할수 있을까?
&mut와는 다르게 &는 동시에 수많은 참조가 존재할수 있기에 여러 스레드에 전달됐을경우 동시에 접근이 가능합니다
이때 T가 !Sync라면 위험하기 때문에 Send를 구현할수 없게 막아놨습니다
5. 다음 코드에있는 Foo::foo의 &self는 무슨 타입일까?
&Self입니다 &Foo와는 다름을 주의해주세요
마지막 &Foo 인줄 알았는데 &Self 였군
trait 메소드들은 항상 구현되는 Self를 기준으로 돌아감 struct도 마찬가지지만 얘는 Self랑 똑같으니 뭐