C# 에서는 사용자 정의 (Class / Struct) 형식에서 operator 키워드로 정적 멤버 함수를 정의하여 연산자를 오버로드 할 수 있습니다. 모든 연산자를 오버로드할 수 있는 것은 아니며, 일부 제한이 있는 연산자도 있습니다.

 

주의할 점이 있습니다. 비교 연산자를 오버로드하는 경우에는 쌍으로 오버로드해야합니다.

예를 들어서, == 연산자를 오버로드하면 != 연산자도 오버로드 해야합니다. (하나만 오버로드 한다면 아래와 같은 오류가 발생하오니, 꼭 참고해서 개발하시면 됩니다.)

 

 

그뿐만 아니라, ==, != 연산자를 오버로드 했다면 Equals / GetHashCode 메서드를 오버라이드 해야한다는 점도 알고계셔야 합니다. (컴파일 오류나서 저도 알았습니다ㅎㅎ)

 

 

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Kilogram {
    public double mass;
    public Kilogram(double mass) => this.mass = mass;
 
    public override bool Equals(object obj) {
        if (!(obj is Kilogram)) return false;
        return Equals((Kilogram)obj);
    }
 
    public override int GetHashCode() => mass.GetHashCode();
 
    public static Kilogram operator +(Kilogram k1, Kilogram k2) => new Kilogram(k1.mass + k2.mass);
    public static Kilogram operator -(Kilogram k1, Kilogram k2) => new Kilogram(k1.mass - k2.mass);
    public static bool operator ==(Kilogram k1, Kilogram k2) => Object.ReferenceEquals(k1.mass, k2.mass) ? true : k1.mass.Equals(k2.mass);
    public static bool operator !=(Kilogram k1, Kilogram k2) => Object.ReferenceEquals(k1.mass, k2.mass) ? false : !k1.mass.Equals(k2.mass);
}
 
public class TestKilogram {
    public TestKilogram() {
        var k = new Kilogram(1);
        var m = new Kilogram(3);
        var plus = k + m;
        var minus = k - m;
 
        if (k == m) {
            Console.WriteLine("같음");
        }
        if (k != m) {
            Console.WriteLine("다름");
        }
    }
}
cs

 

+, -와 비교 비교연산자인 ==, != 을 오버로드한 코드입니다.

그 이후 18번 라인부터 새로운 클래스내에서 Kilogram 인스턴스를 생성하여, 새로 구현한 연산자를 테스트 해보았습니다. 우리가 기본적으로 알고 있었던 숫자형에서 사용되었던 +, - 와 비교연산자를 클래스 내에서도 작동하는 것을 볼 수 있습니다.

 

+ Recent posts