C# 14: Instance Operator
지금까지는(C# 14이전) 연산자 오버로드(operator overload)를 구현할 때 항상 static 멤버로 정의했어야 했는데,
C# 14부터는 연산자 오버로드를 Instance 멤버로 구현할 수 있게 되었다. 모든 연산자에 대해 Instance 멤버로 구현할 수 있는 것은 아니고,
(1) +=, -=, *=, /= 등과 같은 복합 할당 연산자(Compound Assignment Operator)와 (2) 증감연산을 수행하는 Unary Operator 대해서만
Instance 멤버로 구현할 수 있다.
C# 14 버전은 객체의 상태를 변경하는 연산자에 대해서 Instance operator를 구현할 수 있도록 허용하고 있는데,
이는 기본적으로 객체를 직접수정(in-place mutation)을 할 수 있는 연산자에 대해 Instance operator를 허용하여
추가적인 메모리 할당 없이 객체의 상태를 변경하여 성능을 향상시킬 수 있도록 한 것이다.
이러한 맥락에서 객체의 상태를 변경하지 않는 연산자에 대해서는 여전히 static 멤버로 구현해야 하는데,
+, -, *, / 등과 같은 이항 연산자(Binary Operator)는 여전히 static 멤버로 구현해야 한다. 예를 들어, + 연산자의 경우
c = a + b는 a와 b의 값을 더한 새로운 객체(c)를 반환하는 연산이므로 객체의 상태를 변경하지 않기 때문에 static 멤버로 구현하는 것이 적절하다.
반면에, += 연산자의 경우 c += a는 c의 값을 a만큼 증가시키는 연산이므로 객체(c)의 상태를 변경하기 때문에 instance 멤버로 구현하는 것이 적절하다.
예제
public struct Vector
{
public int X;
public int Y;
// C# 14: 복합대입연산자 += 에 대한 Instance operator
public void operator +=(Vector other)
{
this.X += other.X;
this.Y += other.Y;
}
// C# 14: 증감연산자 ++ 에 대한 Instance operator
public void operator ++()
{
this.X++;
this.Y++;
}
// (C# 1 ~ C# 14) Binary 연산자 + 에 대한 static operator
public static Vector operator +(Vector a, Vector b)
{
Vector c = new Vector();
c.X = a.X + b.X;
c.Y = a.Y + b.Y;
return c;
}
}
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.