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
문제 없이 결과값이 출력 된다.
연산자 오버로딩이 가능한 연산자
연산자 | 오버로드 가능성 |
+, -, !, ~, ++, --, true, false | 이 단항 연산자는 오버로드할 수 있습니다. |
+, -, *, /, %, &, | , ^, <<, >> | 이 이항 연산자는 오버로드할 수 있습니다. |
==, !=, <, >, <=, >= | 비교 연산자는 오버로드할 수 있습니다. 단, 이 표의 아래에 있는 참고 사항을 참조하십시오. |
&&, || | 조건 논리 연산자는 오버로드할 수 없지만, 오버로드 가능한 &및 | 를 사용하여 계산할 수 있습니다. |
[] | 배열 인덱싱 연산자는 오버로드할 수 없지만 인덱서를 정의할 수 있습니다. |
(T)x | 캐스트 연산자는 오버로드할 수 없지만 새로운 변환 연산자를 정의할 수 있습니다(explicit 및 implicit 참조). |
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= | 할당 연산자는 오버로드할 수 없지만 다른 방법으로 계산할 수 있습니다. 예를 들어, += 연산자는 오버로드할 수 있는 + 연산자를 사용하여 계산할 수 있습니다. |
=, ., ?:, ??, ->, =>, f(x), as,checked, unchecked, default,delegate, is, new, sizeof, typeof | 이 연산자는 오버로드할 수 없습니다. |
자료출처 : 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 |