Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Method Dispatch에 대하여 설명해주세요. #35

Open
0Hooni opened this issue Jan 12, 2025 · 4 comments
Open

Method Dispatch에 대하여 설명해주세요. #35

0Hooni opened this issue Jan 12, 2025 · 4 comments

Comments

@0Hooni
Copy link
Collaborator

0Hooni commented Jan 12, 2025

No description provided.

@youn9k
Copy link
Collaborator

youn9k commented Jan 16, 2025

Method Dispatch는 어떤 메소드를 실행할 것인지를 결정하고 실행하는 매커니즘입니다.
이러한 Dispatch Swift에선 Static Dispatch와 Dynamic Dispatch로 나뉩니다.
Static Dispatch는 어떤 메소드를 실행시킬 지 컴파일 타임에 결정하게 되고 런타임에는 그대로 실행만 하면 되어 가장 빠릅니다.
Dynamic Dispatch는 상속을 통해 다형성으로 동작하거나 프로토콜을 채택하는 경우 vTable(Protocol은 witness table)을 참조하여 런타임에 어떤 메소드를 실행할 지 결정하여 Static Dispatch에 비해 성능 상 오버헤드가 발생합니다.
하지만 항상 Dynamic Dispatch로 동작하는 것은 아니며, final 키워드를 통해 상속을 제한하거나 Swift 컴파일러가 해당 클래스는 컴파일타임에 결정할 수 있다면 Static Dispatch로 최적화한다고 합니다.

@Kiyoung-Kim-57
Copy link
Collaborator

Kiyoung-Kim-57 commented Jan 16, 2025

메서드 디스패치는 객체의 메서드 호출을 결정하는 방식입니다.

정적 디스패치는 객체의 메서드 호출이 컴파일 시에 결정됩니다. 주로 값 타입의 메서드가 정적 디스패치를 사용합니다.
컴파일 타임에 어떤 메서드를 호출할지 결정되기 때문에 성능상 이점이 있습니다.

동적 디스패치는 객체의 메서드 호출이 런타임 시에 결정됩니다. 주로 참조 타입의 메서드가 동적 디스패치를 사용합니다.
런타임 시에 어떤 메서드를 호출할지 vTable의 포인터를 통해 결정하기 때문에 성능상 저하가 있습니다.
하지만 메서드 오버라이딩 등을 통해 메서드의 다형성을 보장하기 위해서는 동적 디스패치를 사용해야합니다.

클래스는 동적 디스패치를 사용하지만 더 이상 상속이 필요없어 굳이 동적 디스패치를 사용할 일이 없다면 final 키워드를 이용해 정적 디스패치를 사용해 성능상 이점을 챙길 수 있습니다.

@hsw1920
Copy link
Owner

hsw1920 commented Jan 16, 2025

Method Dispatch는 어떤 메서드가 호출되었을 때, 프로그램이 어떤 명령어(메서드)를 실행할 지 선택하는 메커니즘을 말합니다. Swift에서는 컴파일타임에 결정되는 Static Dipatch와 런타임에 결정되는 Dynamic Dispatch가 존재합니다.
객체지향 프로그래밍에서 상속과 다형성을 통해서 같은 메서드라도 다양하게 동작할 수 있습니다. 컴파일러는 메서드를 실행할 때 어떤 메서드 정의를 호출해야할 지 결정해야하며 이를 컴파일 타임에 명확하게 결정할 수 있다면 Static Dispatch 그렇지 않다면 Dynamic Dispatch로 동작합니다.
기본적으로 모든 값타입에서는 Static Dispatch가 적용됩니다.
반면, class의 경우 상속과 다형성이 적용되므로 특정 메서드를 실행할 때 해당 메타 타입의 vtable을 참조하여 호출할 메서드를 실행하는 Dynamic Dispatch로 동작합니다.
하지만 class라 하여도 final 키워드를 통해 더이상 오버라이드 되지 않음을 명시하여 Static Dispatch로 동작하게 할 수 있고, private 키워드를 붙이거나, Whole Module Optimization을 통해서 해당 모듈의 메서드나 프로퍼티가 오버라이딩 되는지를 파악하여 internal이라도 final로 추론하여 Static Dispatch로 동작하도록 할 수 있습니다.

@0Hooni 0Hooni changed the title Method Dispatch에 대하여 설명해주세요 Method Dispatch에 대하여 설명해주세요. Jan 17, 2025
@0Hooni
Copy link
Collaborator Author

0Hooni commented Jan 17, 2025

🙋🏻 답변

메서드 디스패치는 프로그래밍에서 어떠한 메서드가 호출될지 결정하는 메커니즘을 의미합니다. 메서드 디스패치는 정적 디스패치와 동적 디스패치로 나눠집니다.

정적 디스패치는 컴파일 타임에 메서드 호출이 결정돼서 빠른 실행 식도를 제공합니다. 주로 구조체나 열거형과 같이 더이상 메서드의 오버라이딩 가능성이 없는 경우에 적용됩니다. 또한 클래스에 final 키워드를 통해 추가 상속 가능성을 없앤 객체에서도 사용될 수 있습니다.

동적 디스패치는 런타임에 메서드 호출을 결정하는 방식입니다. 주로 클래스나 프로토콜 메서드에서 사용됩니다. 이 둘은 메서드의 다형성이 존재하므로 런타임에 결정되는 방식을 사용합니다. 이 때 실행할 메서드를 결정하기 위해 vTable이나 witnessTable을 사용해줍니다. 또한 정적 디스패치와 다르게 추가적인 과정이 존재하기에 성능적인 오버헤드가 발생하게 됩니다.

🏷️ 키워드

static, dynamic, 타입, 오버라이딩, 다형성, 성능, vTable, witnessTable

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants