오버로딩은 C#에서 메서드의 이름은 동일하지만 매개변수의 형식, 개수, 또는 순서가 다른 여러 버전의 메서드를 정의하는 방법입니다. 이러한 오버로딩은 컴파일 시간에 결정되며, 호출된 메서드는 인수의 형식에 따라 정적으로 선택됩니다.
더블 디스패치는 런타임에 두 개의 객체의 형식에 따라 호출할 메서드를 동적으로 선택하는 메커니즘입니다. C#은 실제로 두 개의 다른 형식에 따라 동적으로 메서드를 선택하기 위한 명시적인 지원을 제공하지 않습니다.
그러나 C#에서는 오버로딩이 더블 디스패치와 유사한 결과를 달성할 수 있습니다. 오버로딩을 사용하여 메서드를 호출할 때 컴파일러는 주어진 매개변수의 형식에 따라 적절한 메서드를 선택합니다. 이는 오버로딩된 메서드가 호출될 때 런타임에 메서드를 동적으로 선택하는 것과 유사한 결과를 얻는 것을 의미합니다.
간단한 예제를 통해 두 메커니즘이 어떻게 상호 관련되는지 살펴보겠습니다.
using System;
class Shape {}
class Circle : Shape {}
class Rectangle : Shape {}
class Drawing
{
public void Draw(Shape shape) => Console.WriteLine("Drawing a shape");
public void Draw(Circle circle) => Console.WriteLine("Drawing a circle");
public void Draw(Rectangle rectangle) => Console.WriteLine("Drawing a rectangle");
}
class Program
{
static void Main()
{
Drawing drawing = new Drawing();
Circle circle = new Circle();
Rectangle rectangle = new Rectangle();
drawing.Draw(circle); // "Drawing a circle"
drawing.Draw(rectangle); // "Drawing a rectangle"
}
}
위의 예제에서 Drawing
클래스는 여러 오버로딩된 Draw
메서드를 갖고 있습니다. 실제로 drawing.Draw(circle)
와 drawing.Draw(rectangle)
호출 시에 컴파일러는 주어진 객체의 형식에 따라 적절한 메서드를 선택합니다. 이는 더블 디스패치의 원리와 유사한 동적 메서드 선택 결과를 나타냅니다.
더블 디스패치와 오버로딩의 관계는 C#에서 유사한 결과를 달성하는 데 활용될 수 있음을 보여줍니다. 이러한 유사성을 이해하고 활용함으로써 보다 유연하고 다형적인 프로그래밍을 할 수 있습니다.
참고 문헌:
- https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/methods#endregions