[c#] C# 더블 디스패치와 오버로딩의 관계

오버로딩은 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#에서 유사한 결과를 달성하는 데 활용될 수 있음을 보여줍니다. 이러한 유사성을 이해하고 활용함으로써 보다 유연하고 다형적인 프로그래밍을 할 수 있습니다.

참고 문헌: