연산자 오버로딩(Operator Overloading)은 기존 연산자(+, -, *, / 등)의 기능을 사용자 정의 타입(클래스나 구조체)에 맞게 재정의 하는 것을 의미한다.
예를 들어 Unity에서 제공하는 Vector2구조체를 살펴보면
Vector2 v1 = new Vector(1, 2);
Vector2 v2 = new Vector(3, 4);
Vector2 result = v1 + v2; // 결과 : 4, 6
위 코드에서 v1 + v2처럼 + 연산자가 사용된 것은 Unity에서 Vector2 내부에 + 연산을 정의해줬기 때문에 가능하다
실제 내부 구현은 아래처럼 되어 있다
public static Vector2 operator +(Vector2 a, Vector2 b)
{
return new Vector2(a.x + b.x, a.y + b.y);
}
이처럼 + 연산자는 operator 키워드를 사용해 정적(static) 메서드로 오버로딩 되어 있으며, Vector2 타입 간 더하기 연산이 가능하도록 정의되어 있다
추가로 연산자 오버로딩은 public static으로 정의해야 하는데
public class Player
{
public void SayHello()
{
Debug.Log("Hello");
}
}
// 호출
Player p = new Player();
p.SayHello();
인스턴스를 만들어야 호출이 가능
public class MathUtil
{
public static int Add(int a, int b)
{
return a + b;
}
}
int result = MathUtil.Add(1, 2);
인스턴스 없이 바로 호출 가능
Vector2 v1 = new Vector2(1, 2);
Vector2 v1 = new Vector2(3, 4);
Vector2 result = v1 + v2;
// 내부적으로 이렇게 처리됨
Vector2 result = Vector2.operatoer+(v1, v2);
이와 같이 +연산은 v1 인스턴스에 붙어있는 게 아니라, Vector2 타입의 기능으로 호출됨
연산자 오버로딩을 통해 직관적인 연산 표현을 클래스/구조체에 추가할 수 있다.
operator 키워드와 함께 public static 메서드로 구현한다.
Unity의 Vector2, Vector3, Quaternion 등이 대표적인 예.