[TIL] 연산자 오버로딩(Operator Overloading)

백성은·2025년 6월 10일

TIL

목록 보기
32/34

✅ 연산자 오버로딩이란?

연산자 오버로딩(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 static이어야 할까?

public

  • 연산자 오버로딩은 외부 ㅗ코드에서 사용되기 때문에 해당 메서드가 외부에서도 접근 가능해야 한다.

static

  • 연산자 오버로딩 메서드는 두 개의 인스턴스를 전달받아 결과를 반환한다
  • 특정 인스턴스의 멤버 함수처럼 동작하는 것이 아니라, 타입 자체에서 작동하는 함수이므로 static이어야 한다.

static과 인스턴스 비교 예시

  • 인스턴스 메서드
	public class Player
    {
    	public void SayHello()
        {
        	Debug.Log("Hello");
        }
    }
    
    // 호출
    Player p = new Player();
    p.SayHello();

인스턴스를 만들어야 호출이 가능

  • static 메서드
	public class MathUtil
    {
    	public static int Add(int a, int b)
        {
        	return a + b;
        }
    }
    
    int result = MathUtil.Add(1, 2);

인스턴스 없이 바로 호출 가능

  • 연산자 오버로딩도 static인 이유
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 등이 대표적인 예.

profile
게임 개발일지

0개의 댓글