본문 바로가기
C#/etc.

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

by 스누누피 2024. 12. 11.

C#에는 연산자 오버로딩을 제공한다.

 

연산자 오버로딩이란?

C#에서 제공하고 있는 연산자에 대해 기능을 다시 부여하는 것을 의미한다.

기본 문법 형태는 public static [리턴속성] operator [연산자](매개변수1, 2) 이다.

 

예를 들어 이런 Person 이란 클래스가 있다고 가정을 할때

Person p1 = new Person();
Person p2 = new Person();

Console.WriteLine(p1 + p2); // Error

 

이런식으로 더하기를 하면 당연히 컴파일 오류가 발생할 것이다.

 

하지만 두 Person이 나이의 합을 반환하고 싶다면 어떻게 해야할까

addPerson 이란 메서드를 만들어 addPerson(p1, p2) 이런식으로 사용 할 수 도 있지만

두 사람의 나이가 아닌 4사람 다섯 사람인 경우에는 addPerson( addPerson( addPerson(p1, p2), p3 ), p4 )... 이런식으로 코드가 계속 늘어나게 될것이다.

 

하지만 연산자 오버로딩을 사용하면

p1 + p2 + p3 +p4 ... 이렇게 간단하게 코드를 정리할 수 있다는 장점이 있다.

 

연산자 오버로딩의 조건

1. public으로 정의 해야한다.

2. static으로 정의 해야한다.

3. 오버로딩 매개변수 중 하나는 무조건 그 클래스의 형식이어야 한다.

 


코드 예시

class Player
{
    public string name { get; set; }
    public int age { get; set; }

    public Player(string name, int age)
    {
        this.name = name;
        this.age = age;
    }

    static public bool operator ==(Player p1, Player p2)
    {
        return p1.name == p2.name && p1.age == p2.age ;
    }

    static public bool operator !=(Player p1, Player p2)
    {
        return p1.name != p2.name || p1.age != p2.age;
    }

    static public int operator +(Player p1, Player p2)
    {
        return p1.age + p2.age;
    }

}

 

이렇게 원하는 연산자에 오버로드하면 return 타입도 원하는데로 지정할 수 있다.

== 연산자와 != 연산자는 서로 짝이 되는 연산자이기 때문에 하나만 오버로드 할 수 없다.

Player p1 = new Player("Son", 32);
Player p2 = new Player("Lee", 32);
Player p3 = new Player("Kim", 28);
Player p4 = new Player("Lee", 23);
Player p5 = new Player("Kim", 28);

Console.WriteLine(p1 == p2); // False
Console.WriteLine(p1 == p4); // False
Console.WriteLine(p3 == p5); // True

Console.WriteLine(p1 + p3); // 60

 

출력문을 보면 ==와 +연산자가 오버로드 된것을 확인 할 수 있다.

 

하지만 아래 코드처럼 여러개의 연산자를 사용하면 컴파일 오류가 발생한다.

Console.WriteLine(p1 + p3 + p4);

 

왜냐하면 연산을 순서대로 해보면 'p1 + p3'를 해서 int의 결과값을 얻고 다시 'int 결과값 + p4'를 하면 int 타입과 Player 타입은 더할수없기 때문이다.

 

이 경우엔 int + Player에 대한 연산자 오버로드를 또 해주면 된다.

static public int operator +(int i, Player p2)
{
    return i + p2.age;
}

 

해당 코드를 Player 클래스 안에 넣어주면

Console.WriteLine(p1 + p3 + p4); // 83

 

문제 없이 결과값이 출력 된다.

 


연산자 오버로딩이 가능한 연산자

연산자 오버로드 가능성
+-!~++--truefalse 이 단항 연산자는 오버로드할 수 있습니다.
   
+-*/%&| , ^<<>> 이 이항 연산자는 오버로드할 수 있습니다.
==!=<><=>= 비교 연산자는 오버로드할 수 있습니다. 단, 이 표의 아래에 있는 참고 사항을 참조하십시오.
&&|| 조건 논리 연산자는 오버로드할 수 없지만, 오버로드 가능한 &및 | 를 사용하여 계산할 수 있습니다.
[] 배열 인덱싱 연산자는 오버로드할 수 없지만 인덱서를 정의할 수 있습니다.
(T)x 캐스트 연산자는 오버로드할 수 없지만 새로운 변환 연산자를 정의할 수 있습니다(explicit 및 implicit 참조).
+=-=*=/=%=&=|=^=<<=>>= 할당 연산자는 오버로드할 수 없지만 다른 방법으로 계산할 수 있습니다. 예를 들어, += 연산자는 오버로드할 수 있는 + 연산자를 사용하여 계산할 수 있습니다.
=.?:??->=>f(x)as,checkeduncheckeddefault,delegateisnewsizeoftypeof 이 연산자는 오버로드할 수 없습니다.

자료출처 : https://msdn.microsoft.com/ko-kr/library/8edha89s(v=vs.120).aspx

'C# > etc.' 카테고리의 다른 글

[C#] 열거형 Enum  (0) 2024.12.16
[C#] as, is 키워드  (0) 2024.12.12
[C#] ? 문법 (question mark)  (1) 2024.11.28