C# 연산자 오버로딩, Operator Overloading, public static ~ operator(C#동영상, 닷넷동영상교육, C#학원, 자바학원, C#동영상, WPF학원, WPF교육)
http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=403
ojc.asia
https://www.youtube.com/watch?v=XC3f8CnY6yk&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=14


연산자 오버로딩
Operator Overloading
실습 : VS 2022
연산자 오버로딩(Operator Overloading)
- 연산자 오버로딩이란 +, -와 같은 연산자들을 용도에 맞게 다시 의미, 기능을 부여하여 작동하도록 한 것인데, 메소드 오버로딩에서 메소드의 인자개수나 타입을 변형해서 같은 메소드를 여러개 정의하는 것과 비슷하게 연산자는 같지만 받아들이는 피연산자의 형식이 다르게해서 연산자의 의미, 기능을 여러 개 정의하는 것이다.
- public static ~ operator 키워드를 사용한다.
다음과 같은 A 클래스가 있다고 하자.
public class A{
public int val;
}
A a1 = new A(); a1.val=1;
A a2 = new A(); a2.val=2;
//객체를 더할수는 없다. 오류!!
A a3 = a1 + a2;
위 예제를 다음과 같이 고쳐 보자.
namespace OperatorOverload1
{
public class A
{
public int val;
public static A operator +(A a1, A a2)
{
A a3 = new A();
a3.val = a1.val + a2.val;
return a3;
}
}
class Test
{
static void Main()
{
A a1 = new A(); a1.val = 1;
A a2 = new A(); a2.val = 2;
A a3 = a1 + a2;
Console.WriteLine("a1 + a2 = {0}", a3.val);
}
}
}
[다음 예제를 보자]
namespace OperatorOverload1
{
public class A1
{
public int val;
//아래의 함수는 A1, A2에서는 정의가 가능하며 A3에서는 불가
public static A3 operator +(A1 a1, A2 a2)
{
A3 a3 = new A3();
a3.val = a1.val + a2.val;
return a3;
}
}
public class A2 { public int val; }
public class A3 { public int val; }
class Test
{
static void Main()
{
A1 a1 = new A1(); a1.val = 1;
A2 a2 = new A2(); a2.val = 2;
A3 a3 = a1 + a2;
Console.WriteLine("a1 + a2 = {0}", a3.val);
}
}
}
C#에서 오버로딩 할 수 있는 연산자.
단항 연산자 ::: +, -, !, ~, ++, --, true, false
이항 연산자 ::: +, -, *, /, %, &, |, <<, >>
비교 연산자 ::: ==, !=, <, >, <= , >=
- true와 false를 오버로딩 하면 클래스, 객체를 bool 표현식에서 사용 할 수 있다.
- += 같은 배정 연산자는 오버로딩 할 수 없지만 +연산자를 오버로딩 함으로써 +=을 오버로딩 한 것과 같은 효과를 나타낸다.
- =(등호)는 오버로딩 할 수 없는데 이 연산자는 기능을 바꿀 필요가 없는 것이다.
- &&와 ||역시 오버로딩 할 수 없는데 &, |를 오버로딩 하여 구현하면 된다.
- < 와 >의 경우 반드시 쌍으로 오버로딩 해야 한다. 즉 < 를 오버로딩 했을 때 >도 반드시 오버로딩 해야 한다. 비교연산자를 오버로딩 할 때는 한 연산자에서 다른 연산자를 호출하여 처리할 수도 있다.
- true 와 false의 경우도 반드시 쌍으로 오버로딩 해야 한다.
public class A{
public int val;
public static bool operator > (A op1, Aop2) {
return (op1.val > op2.val);
}
public static bool operator < (A op1, Aop2) {
return !(op1 > op2);
}
}
- ==와 != 연산자에 대해서는 위의 경우 처럼 사용이 가능하나 Object.Equals()와 Object.GetHashCode()도 재정의 하는 경우가 많이 있다. 즉 ==를 재정의 하는 부분에서 Equals 메소드도 재정의 함으로써 사용자가 == 또는 Equals() 어느 것으로 비교하든지 같은 결과가 나타나게 할 수 있다.
[예제]
namespace ConsoleApplication2
{
public class A
{
public int val;
public static bool operator ==(A op1, A op2) { return (op1.val == op2.val); }
public static bool operator !=(A op1, A op2) { return !(op1 == op2); }
public static bool operator >(A op1, A op2) { return (op1.val > op2.val); }
public static bool operator <(A op1, A op2) { return (op1.val < op2.val); }
//op1과 op2가 같아도 true이므로 위의꺼로
//public static bool operator < (A op1, A op2) { return !(op1.val > op2.val); }
public override bool Equals(object op1)
{
return val == ((A)op1).val;
}
//GetHashCode 는 개체의 상태에 기반한 고유한 int 값을 얻는데 사용 한다.
//Equals 메서드를 재정의했다면, 반드시 GetHashCode메서드에 대해서도 재정의를 해줘야 한다
//컴파일러는 Equals만 재정의한 경우 경고 메시지를 표시한다.
//모든 컬렉션에서는 두 객체가 동일한지 알기위해 GeHashCode를 확인하기때문
public override int GetHashCode() { return this.GetHashCode(); }
static void Main()
{
A op1 = new A(); op1.val = 1;
A op2 = new A(); op2.val = 2;
Console.WriteLine("op1 = op2 = {0}", op1 == op2);
Console.WriteLine("op1 = op2 = {0}", op1.Equals(op2));
Console.WriteLine("op1 > op2 = {0}", op1 > op2);
Console.WriteLine("op1 < op2 = {0}", op1 < op2);
}
}
}
연산자오버로딩, OperatorOverloading, 닷넷, 시샵, 닷넷동영상, 시샵동영상, 닷넷교육, 닷넷학원, 시샵학원, 시샵연산자