런타임 다형성(Runtime Polymorphism)은 메서드 오버라이딩(Method Overriding)을 기반으로 동작하며, 동적 바인딩(Dynamic Binding) 또는 늦은 바인딩(Late Binding)이라고도 불립니다. 이름에서 알 수 있듯이, 어떤 메서드가 호출될지는 컴파일 시점이 아닌 프로그램 실행 시점에 결정됩니다.
C#에서는 추상 클래스(Abstract Class)와 가상 함수(Virtual Function)를 사용하여 런타임 다형성을 구현할 수 있습니다.
추상 클래스(Abstract Class)
추상 클래스는 하나 이상의 추상 메서드(abstract method)를 포함하는 클래스입니다. 추상 메서드는 선언만 존재하고 구현 내용이 없으며, 반드시 파생 클래스(자식 클래스)에서 override 키워드를 통해 구현해야 합니다.
다음은 추상 클래스를 활용해 런타임 다형성을 구현한 예제입니다.
예제 코드
using System;
namespace PolymorphismApplication {
abstract class Shape {
public abstract int area();
}
class Rectangle : Shape {
private int length;
private int width;
public Rectangle(int a = 0, int b = 0) {
length = a;
width = b;
}
public override int area() {
Console.WriteLine("Rectangle class area :");
return (width * length);
}
}
class RectangleTester {
static void Main(string[] args) {
Rectangle r = new Rectangle(10, 7);
double a = r.area();
Console.WriteLine("Area: {0}", a);
Console.ReadKey();
}
}
}실행 결과
Rectangle class area : Area: 70
위 예제에서 Shape 추상 클래스는 area()라는 추상 메서드를 선언하고 있으며, 이를 상속받은 Rectangle 클래스가 자신의 면적 계산 로직으로 재정의합니다. 실행 결과를 보면 Rectangle 클래스에서 오버라이딩된 메서드가 호출된 것을 확인할 수 있습니다.
가상 함수(Virtual Function)
기본 클래스에 정의된 함수를 상속받는 클래스에서도 사용하고 싶다면 virtual 키워드를 사용하여 가상 함수로 선언하면 됩니다.
가상 함수의 핵심 특징은 다음과 같습니다.
- 각각의 상속 클래스에서 서로 다른 방식으로 재정의(구현)할 수 있습니다.
- 어떤 버전의 함수가 호출될지는 런타임에 결정됩니다.
즉, 부모 클래스 타입의 변수로 자식 클래스의 객체를 참조하더라도, 실제 객체의 타입에 맞는 오버라이딩된 메서드가 실행됩니다. 이것이 바로 C# 런타임 다형성의 핵심 원리입니다.