C#에서 연산자 오버로딩(Operator Overloading)이란 사용자가 정의한 클래스나 구조체에 대해 +, -, * 같은 기존 연산자의 동작을 재정의하는 기능입니다. 오버로드된 연산자는 특수한 이름을 가진 함수로 취급되며, operator 키워드 뒤에 정의하려는 연산자 기호를 붙여 선언합니다.
예를 들어 두 개의 Box 객체를 더할 때 + 연산자를 사용하고 싶다면, 해당 클래스 내부에 operator+ 메서드를 직접 구현하면 됩니다. 이렇게 하면 객체 간 연산을 훨씬 직관적이고 가독성 있게 표현할 수 있습니다.
C# 연산자 오버로딩 예제
아래 예제에서는 Box 클래스에 + 연산자를 오버로딩하여, 두 상자(Box) 객체의 길이·너비·높이를 각각 더한 새로운 Box 객체를 반환하도록 구현했습니다.
using System;
namespace Demo {
class Box {
private double length; // 상자의 길이
private double breadth; // 상자의 너비
private double height; // 상자의 높이
public double getVolume() {
return length * breadth * height;
}
public void setLength(double len) {
length = len;
}
public void setBreadth(double bre) {
breadth = bre;
}
public void setHeight(double hei) {
height = hei;
}
// + 연산자를 오버로딩하여 두 Box 객체를 더함
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;
}
}
class Tester {
static void Main(string[] args) {
Box Box1 = new Box(); // Box 타입의 Box1 선언
Box Box2 = new Box(); // Box 타입의 Box2 선언
Box Box3 = new Box(); // Box 타입의 Box3 선언
double volume = 0.0; // 부피 값을 저장할 변수
// 첫 번째 상자(Box1) 크기 설정
Box1.setLength(6.0);
Box1.setBreadth(7.0);
Box1.setHeight(5.0);
// 두 번째 상자(Box2) 크기 설정
Box2.setLength(12.0);
Box2.setBreadth(13.0);
Box2.setHeight(10.0);
// Box1의 부피 출력
volume = Box1.getVolume();
Console.WriteLine("Volume of Box1 : {0}", volume);
// Box2의 부피 출력
volume = Box2.getVolume();
Console.WriteLine("Volume of Box2 : {0}", volume);
// 오버로딩된 + 연산자로 두 객체를 더함
Box3 = Box1 + Box2;
// Box3의 부피 출력
volume = Box3.getVolume();
Console.WriteLine("Volume of Box3 : {0}", volume);
Console.ReadKey();
}
}
}실행 결과
Volume of Box1 : 210 Volume of Box2 : 1560 Volume of Box3 : 5400
연산자 오버로딩 시 알아두어야 할 규칙
- 연산자 오버로딩 메서드는 반드시
public static으로 선언해야 합니다. - 오버로딩 가능한 연산자에는 +, -, *, /, %, ==, !=, <, >, <=, >= 등이 있으며, 일부 연산자(&&, || 등)는 간접적으로만 오버로딩할 수 있습니다.
- == 연산자를 오버로딩하면 != 연산자도 반드시 함께 오버로딩해야 합니다.
- =, ., ?: 등의 일부 연산자는 C#에서 오버로딩이 불가능합니다.
이처럼 연산자 오버로딩을 활용하면 복소수, 행렬, 벡터처럼 수학적 의미를 가지는 사용자 정의 타입을 기본 데이터 타입처럼 자연스럽게 다룰 수 있어 코드의 가독성과 유지보수성이 크게 향상됩니다.