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/

반응형

+ Recent posts