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와는 다름을 주의해주세요