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

C# 연산자 오버로딩이란? 오버로드 가능한 연산자와 불가능한 연산자 완벽 정리

C#의 연산자 오버로딩(Operator Overloading)은 사용자가 정의한 클래스나 구조체에 대해 +, -, == 같은 기본 연산자를 재정의하여 사용할 수 있게 해주는 강력한 기능입니다. 예를 들어, 복소수나 행렬처럼 직접 만든 타입에도 산술 연산자를 자연스럽게 적용할 수 있어 코드의 가독성과 직관성이 크게 향상됩니다.

다만 모든 연산자를 오버로드할 수 있는 것은 아닙니다. 아래에서 C#에서 오버로드가 가능한 연산자와 불가능한 연산자를 항목별로 정리했습니다.


오버로드할 수 있는 연산자

1. 단항 연산자: +, -, !, ~, ++, --

단항 연산자는 하나의 피연산자를 대상으로 동작하며, C#에서 자유롭게 오버로드할 수 있습니다.

2. 이항 연산자: +, -, *, /, %

두 개의 피연산자를 사용하는 산술 연산자들로, 역시 오버로드가 가능합니다. 예를 들어 두 객체를 더하는 + 연산자를 직접 정의할 수 있습니다.

3. 비교 연산자: ==, !=, <, >, <=, >=

비교 연산자도 오버로드할 수 있습니다. 단, ==!=, <>처럼 서로 짝을 이루는 연산자는 반드시 한 쌍으로 함께 오버로드해야 한다는 점에 유의하세요.


오버로드할 수 없는 연산자

4. 조건부 논리 연산자: &&, ||

조건부 논리 연산자는 직접 오버로드할 수 없습니다. 다만 &| 연산자를 오버로드하면, 컴파일러가 이를 활용해 &&||를 간접적으로 지원합니다.

5. 복합 대입 연산자: +=, -=, *=, /=, %=

복합 대입 연산자는 직접 오버로드할 수 없습니다. 하지만 해당하는 이항 연산자(예: +)가 오버로드되어 있다면, +=는 자동으로 그 결과를 활용해 동작합니다.

6. 기타 연산자: =, ., ?:, ->, new, is, sizeof, typeof

대입 연산자(=), 멤버 접근 연산자(.), 삼항 조건 연산자(?:), new, is, sizeof, typeof 등 언어의 핵심 동작과 관련된 연산자들은 오버로드가 허용되지 않습니다.


간단한 오버로딩 예제

아래는 복소수를 표현하는 클래스에서 + 연산자를 오버로드하는 예시입니다.

public class Complex
{
    public double Real { get; set; }
    public double Imaginary { get; set; }

    public static Complex operator +(Complex a, Complex b)
    {
        return new Complex { Real = a.Real + b.Real, Imaginary = a.Imaginary + b.Imaginary };
    }
}

이처럼 연산자 오버로딩을 적절히 활용하면 사용자 정의 타입도 기본 타입처럼 자연스럽게 다룰 수 있습니다. 단, 코드의 의미를 명확하게 유지하기 위해 남용하지 않는 것이 좋습니다.