trait를 인자로 받을 때 &impl과 &dyn차이
Trait강좌에서 &impl만을 사용해 trait를 구현한 객체를 함수인자로 전달 받았는데 &dyn을 사용했을 때 차이가 궁금합니다.정적 디스패치, 동적 디스패치라고는 나오는데 &dyn이 들어가야하는 곳에 항상 &impl도 동작할 것 같아 어떤 예에서 &dyn을 사용해야 하는지 이해가 가지 않습니다 ㅠ강의 내용에는 나와있지 않은 부분이지만 강사님 경험상 dyn keyword를 사용해야만 하는 경우가 있으셨을까요??
답변 2
1
심도 깊은 질문 감사합니다. impl은 정적 디스패치라고, 컴파일 타임에 해당 트레이트를 구현한 구체적인 타입을 파악할 수 있는 경우이고, dyn같은 경우 동적으로 런타임에 파악하는 경우에 활용합니다. 전자는 컴파일타임에 구체적인 정보를 파악해야 하는 대신에 성능 페널티가 없고, 후자는 컴파일 타임에 미리 정해지지 않은 해당 트레이트 구현체를 활용할 수 있지만, 런타임에 해당 구현체를 쫓아가야 하는 부담이 있습니다.
해당 주제는 중급 강의에 잘 정리해볼게요.
수강 및 질문 감사드립니다.
0
안녕하세요, 인프런 AI 인턴입니다.
제공된 정보에는 Rust의 &impl Trait과 &dyn Trait의 사용과 차이점에 대한 직접적인 내용이 포함되어 있지 않습니다. 따라서, 구체적인 예시나 내용으로 답변드리기 어렵습니다. 하지만, Rust에서 &impl Trait과 &dyn Trait의 차이를 간략하게 설명드릴 수 있습니다.
&impl Trait은 정적 디스패치를 사용합니다. 이는 컴파일 타임에 구체적인 타입이 결정되며, 각 타입 별로 별도의 함수 코드가 생성됩니다. 덕분에 실행 시점에서의 성능이 우수할 수 있으나, 컴파일된 코드의 크기가 증가할 수 있습니다.&dyn Trait은 동적 디스패치를 사용합니다. 이 경우 컴파일 타임에는 구체적인 타입이 결정되지 않고, 런타임에 타입 정보를 확인하여 해당 기능을 실행합니다. 이로 인해 코드의 유연성은 증가하지만, 성능상의 오버헤드(예: 추가적인 indirection)가 발생할 수 있습니다.
&impl Trait과 &dyn Trait 중 어느 것을 사용할지는 상황에 따라 다릅니다. 예를 들어, 함수가 단일 타입의 인자만을 처리하면서 성능이 중요한 상황이라면 &impl Trait이 좋을 수 있습니다. 반대로, 여러 다른 타입의 객체들을 동일한 함수에서 처리해야 하고, 이 타입들이 모두 특정 트레잇을 구현하는 경우에는 &dyn Trait이 적합할 수 있습니다.
Rust의 공식 문서나 해당 주제에 관련된 추가 학습 자료를 참고하시는 것을 추천드립니다.
다음강의 플랜이 어떻게 되실까요?
0
35
1
소스코드
0
32
1
강의 자료 ppt나 pdf 파일은 없을까요?
0
69
1
선생님 ppt자료를 받아서 공부하고 싶습니다.
0
52
2
Rust는 어떻게 컴파일 타임에 dangling reference를 막나요?
0
70
2
강의 추가 계획 질문
0
76
2
가변 참조에 대한 주요 제약사항 퀴즈 문의
0
66
2
소유권 이전과 관련된 질문입니다
0
148
2
&r1 을 써야하는지 r1을 써야하는지?
1
120
1
임대값 수명에 대한 질문
1
122
1
튜플 구조체에서 println! 사용시 에러가 발생합니다.
0
166
1
메모리 관리규칙에서 질문드립니다.
1
210
1
튜플과 구조체 차이 설명에 관한 질문
0
377
1
튜플과 배열 강의 4:50에서 벡터 나중에 설명해주신다고 하셨는데
0
193
1
구조체는 언제나 Heap에 저장되나요??
2
418
2
Lifecycle 강의에서 두 문자열 슬라이스를 비교해 긴 문자열 슬라이스를 리턴하는 것 관련 질문
0
268
1
혹시 어떤 폰트일까요?
0
457
2
build 오류
0
403
1
웹 어플리케이션 개발에도 잘 사용되나요?
1
458
1
임대값의 수명 강의가 재생이 안되고 있습니다~
0
413
3
임대값의 수명에 대한 강의는 언제쯤 볼 수 있을까요?
0
350
2
문자열 리터럴이 너무 어려워요ㅠㅠ
1
556
1
Integer는 자동으로 copy되서(copy type)(integer 는 stack에 할당되서)
0
367
2
명령어를 입력 한 후 source "$HOME/.cargo/env" 이 명령어를 입력해야 합니다.
0
336
2





