정적 바인딩(Static Binding)은 프로그램이 실행되기 전, 즉 컴파일 시점에 함수와 객체를 연결하는 메커니즘을 말합니다. 런타임에 어떤 함수가 호출될지 결정하는 동적 바인딩과 달리, 정적 바인딩은 컴파일러가 미리 호출 대상을 확정하기 때문에 실행 속도가 빠르다는 장점이 있습니다.
C#에서는 정적 다형성(Static Polymorphism)을 구현하기 위해 두 가지 기법을 제공합니다.
- 함수 오버로딩(Function Overloading)
- 연산자 오버로딩(Operator Overloading)
1. 함수 오버로딩(Function Overloading)
함수 오버로딩은 동일한 스코프 내에서 같은 이름의 함수를 여러 개 정의할 수 있는 기능입니다. 매개변수의 개수나 데이터 타입이 서로 다르기만 하면 되며, 컴파일러는 호출 시 전달된 인자를 보고 가장 적합한 함수를 자동으로 선택합니다.
예제 코드
void print(int i) {
Console.WriteLine("Printing int: {0}", i);
}
void print(double f) {
Console.WriteLine("Printing float: {0}", f);
}위 예제처럼 print()라는 하나의 함수 이름으로 정수형과 실수형을 각각 처리할 수 있어, 코드의 가독성과 재사용성이 크게 향상됩니다.
2. 연산자 오버로딩(Operator Overloading)
오버로드된 연산자는 특별한 이름을 가진 함수입니다. operator 키워드 뒤에 정의하고자 하는 연산자 기호를 붙여 선언하며, 사용자 정의 타입(클래스나 구조체)에도 기본 타입처럼 연산자를 사용할 수 있게 해줍니다.
예제 코드
public static Box operator+(Box b, Box c) {
Box box = new Box();
box.length = b.length + c.length;
box.breadth = b.breadth + c.breadth;
box.height = b.height + c.height;
return box;
}위 코드는 두 개의 Box 객체를 더하는 + 연산자를 재정의한 예입니다. 이렇게 하면 Box box3 = box1 + box2;와 같이 직관적인 코드를 작성할 수 있습니다. 참고로 연산자 오버로딩 메서드는 반드시 public static으로 선언해야 하며, 일반적으로 연산 결과를 반환하는 것이 올바른 구현 방식입니다.
정리
정적 바인딩은 컴파일 시점에 호출 대상이 결정되므로 성능 면에서 유리하며, 함수 오버로딩과 연산자 오버로딩을 통해 유연하고 직관적인 API를 설계할 수 있습니다. 반대로 런타임에 바인딩이 결정되는 동적 바인딩은 메서드 오버라이딩(Overriding)과 함께 사용되며, 상황에 맞게 두 기법을 활용하는 것이 좋은 C# 프로그래밍의 핵심입니다.