Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 연산자 오버로딩(Operator Overloading) 구현 방법 총정리

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#에서 오버로딩이 불가능합니다.

이처럼 연산자 오버로딩을 활용하면 복소수, 행렬, 벡터처럼 수학적 의미를 가지는 사용자 정의 타입을 기본 데이터 타입처럼 자연스럽게 다룰 수 있어 코드의 가독성과 유지보수성이 크게 향상됩니다.