C#에서 정적 다형성(static polymorphism)을 구현하는 대표적인 기법은 크게 두 가지입니다.
- 함수 오버로딩(Function Overloading)
- 연산자 오버로딩(Operator Overloading)
함수 오버로딩(Function Overloading)
함수 오버로딩이란 이름은 같지만 매개변수가 서로 다른 두 개 이상의 메서드를 정의하는 것을 의미합니다.
C#에서 함수 오버로딩은 매개변수의 개수를 다르게 하거나, 매개변수의 데이터 타입을 다르게 하는 방식으로 구현할 수 있습니다.
예를 들어 숫자들의 곱셈 결과를 계산하는 함수가 있다고 가정해 보겠습니다. 이 경우 오버로딩된 메서드들은 이름은 동일하지만 받는 매개변수의 개수가 서로 다릅니다.
public static int mulDisplay(int one, int two) { }
public static int mulDisplay(int one, int two, int three) { }
public static int mulDisplay(int one, int two, int three, int four) { }
다음 예제를 통해 함수 오버로딩이 실제로 어떻게 구현되는지 살펴보겠습니다.
예제 코드
using System;
public class Demo {
public static int mulDisplay(int one, int two) {
return one * two;
}
public static int mulDisplay(int one, int two, int three) {
return one * two * three;
}
public static int mulDisplay(int one, int two, int three, int four) {
return one * two * three * four;
}
}
public class Program {
public static void Main() {
Console.WriteLine("Multiplication of two numbers: " + Demo.mulDisplay(10, 15));
Console.WriteLine("Multiplication of three numbers: " + Demo.mulDisplay(8, 13, 20));
Console.WriteLine("Multiplication of four numbers: " + Demo.mulDisplay(3, 7, 10, 7));
}
}
실행 결과
Multiplication of two numbers: 150 Multiplication of three numbers: 2080 Multiplication of four numbers: 1470
위 코드에서 볼 수 있듯이, 컴파일러는 호출 시 전달된 인자의 개수와 타입을 기준으로 알맞은 메서드를 자동으로 선택합니다. 이것이 바로 컴파일 타임에 다형성이 결정되는 정적 다형성의 핵심입니다.
연산자 오버로딩(Operator Overloading)
연산자 오버로딩은 특수한 이름을 가진 함수를 정의하는 방식으로 구현됩니다. 즉, operator 키워드 뒤에 오버로딩하려는 연산자 기호를 붙여 선언합니다.
모든 연산자를 오버로딩할 수 있는 것은 아닙니다. 아래 표는 어떤 연산자는 오버로딩이 가능하고, 어떤 연산자는 불가능한지 정리한 것입니다.
| 번호 | 연산자 및 설명 |
|---|---|
| 1 | +, -, !, ~, ++, -- 이 단항(unary) 연산자들은 하나의 피연산자를 사용하며, 오버로딩할 수 있습니다. |
| 2 | +, -, *, /, % 이 이항(binary) 연산자들은 두 개의 피연산자를 사용하며, 오버로딩할 수 있습니다. |
| 3 | ==, !=, <, >, <=, >= 비교 연산자들도 오버로딩할 수 있습니다. 단, ==와 !=처럼 짝을 이루는 연산자는 반드시 함께 오버로딩해야 합니다. |
| 4 | &&, || 조건부 논리 연산자는 직접 오버로딩할 수 없습니다. 다만 &와 |, 그리고 true/false 연산자를 오버로딩하면 간접적으로 활용할 수 있습니다. |
| 5 | +=, -=, *=, /=, %= 복합 대입 연산자는 직접 오버로딩할 수 없습니다. 대신 해당 산술 연산자(+, -, * 등)를 오버로딩하면 자동으로 적용됩니다. |
| 6 | =, ., ?:, -<, new, is, sizeof, typeof 이 연산자들은 오버로딩이 허용되지 않습니다. |