Section 3.1: 재정의 가능한 연산자들
C# 은 operator
키워드를 사용한 정적 (static) 멤버 함수를 선언하는 방식을 통해 사용자 정의 타입들로 하여금 연산자를 재정의 할 수 있는 기능을 제공하고 있다.
아래의 예제는 +
연산자를 구현하는 방법을 설명하고 있다.
아래와 같이 복소수 (complex number) 를 나타내는 Complex
라는 이름의 클래스가 존재한다고 했을 때:
public struct Complex {
public double Real {
get;
set;
}
public double Imaginary {
get;
set;
}
}
이 클래스로 하여금 아래와 같은 +
연산자를 사용할 수 있는 추가적인 기능을 제공하고자 한다면,
Complex a = new Complex() {
Real = 1,
Imaginary = 2
};
Complex b = new Complex() {
Real = 4,
Imaginary = 8
};
Complex c = a + b;
이 클래스를 위해 +
연산자를 재정의 할 필요가 있을 것이다. 이는 operator
키워드를 사용한 정적 함수를 사용함으로써 구현 가능하다:
public static Complex operator + (Complex c1, Complex c2) {
return new Complex {
Real = c1.Real + c2.Real,
Imaginary = c1.Imaginary + c2.Imaginary
};
}
+
, -
, *
, /
와 같은 연산자들은 모두 재정의가 가능하다. 또한, 동일한 타입을 반환하지 않는 연산자들 역시 재정의가 가능한 연산자 목록에 포함된다. (예를 들어, ==
와 !=
는 boolean 값을 반환하지만 재정의가 가능하다) 아래에 소개된 짝 맞춤의 규칙은 여기에도 동일하게 적용된다.
역주:
==
를 재정의 하는 경우!=
도 재정의해야 함을 의미하는 것으로 보입니다.
비교 연산자는 짝을 맞추어서 재정의 되어야 한다. (예: 만약 <
가 재정의 된다면, >
역시 재정의 되어야 한다).
재정의 가능한 연산자들의 전체 목록은 (재정의 불가능한 연산자들의 목록 및 몇몇 재정의 가능한 연산자들에게 해당하는 제약사항의 목록을 포함하여) MSDN - 재정의 가능한 연산자들 (C# 프로그래밍 가이드) 에서 확인할 수 있다.
is
연산자 재정의는 C# 7.0 의 Pattern Matching 기능과 함께 도입되었다. 더욱 세부적인 사항은 Pattern Matching 항목을 참고하라.
Cartesian 이라는 타입이 아래와 같이 주어졌다고 할 때,
public class Cartesian {
public int X {
get;
}
public int Y {
get;
}
}
재정의 가능한 is
연산자는 극좌표 (Polar coordinates) 에 대해 아래와 같이 정의될 수 있다.
public static class Polar {
public static bool operator is(Cartesian c, out double R, out double Theta) {
R = Math.Sqrt(c.X * c.X + c.Y * c.Y);
Theta = Math.Atan2(c.Y, c.X);
return c.X != 0 || c.Y != 0;
}
}
이는 아래와 같은 형식으로 사용될 수 있을 것이다.
var c = Cartesian(3, 4);
if (c is Polar(var R, *)) {
Console.WriteLine(R);
}
(위 예제는 Roslyn Pattern Matching Documentation 에서 가져온 예제이다)
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.
[출처] https://books.goalkicker.com/CSharpBook/
'번역 > C# Notes for Professionals' 카테고리의 다른 글
3.3: 관계 연산자 (Relational Operator) 들 (0) | 2020.10.26 |
---|---|
3.2: 동등 (equality) 연산자 재정의하기 (0) | 2020.10.22 |
3: 연산자 (operator) 들 (0) | 2020.10.16 |
2.1: 각종 Literal 들 (0) | 2020.10.15 |
1.5: LinqPad 를 이용하여 새로운 Query 를 생성하기 (0) | 2020.10.14 |