반응형
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 인스턴스를 생성하여, 새로 구현한 연산자를 테스트 해보았습니다. 우리가 기본적으로 알고 있었던 숫자형에서 사용되었던 +, - 와 비교연산자를 클래스 내에서도 작동하는 것을 볼 수 있습니다.
반응형
'개발 > C#' 카테고리의 다른 글
[C#] 확장메서드 (Extension Method) 에 대해 알아보자. (0) | 2019.12.05 |
---|---|
[C#] Indexer 무엇인가? (0) | 2019.12.05 |
[C#] async/await 비동기 프로그래밍 알아보자! (0) | 2019.12.04 |
[C#] 익명 타입(Anonymous Type) 이란? (0) | 2019.12.04 |
[C#] override VS new 재정의 사용 방법(feat. virtual, abstract) (0) | 2019.12.04 |