연산자 오버로딩(Operator overloading)
- 연산도 특수한 메소드 일종(내부 메소드)
- 메소드에 비해 연산자 사용 시 코드가 단순, 명확
- 기존 연산자를 메소드 오버로딩 하듯이 사용자가 오버로딩 가능
- 객체들간의 연산에 유용
public Static void Main()
{
int i =10;
int j =20;
int k, l
k = i + j;
l = Add(i,j);
Console.WriteLine(k);
Console.WriteLine(l);
}
public static int Add(int value1, int value2)
{
return value1 + value2;
}
연산자 오버로딩이 가능한 연산자
- 단항연산자 : +, -, !, ~, ++, --, true, false
- 이항연산자 : +, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=
public static 반환형 operator OP (object1, object2)
{
구현부;
}
- Op : 연산자(+, -, ....)
- 일반적으로 반환형은 인자형과 일치시켜준다. (int + int = int)
- 인자의 수는 기존 연산자가 가지는 인자 수와 일치 시켜준다.
- 단항 연산자는 인자가 반드시 연산자 오버로딩을 구현하는 구조체나 클래스이어야 한다.
- 이항 연산자는 보통 첫번째 인자는 오버로딩 하는 클래스나 구조체, 두번째는 자유
- C#에서 정의되지 않은 연산자 사용 불가
class Time
{
private int hours;
private int minutes;
//생성자 초기화 리스트
public Time(int minutes) : this(0, minutes){}
public Time(int hours, int minutes)
{
//멤버초기화
this.hours = hours;
this.minutes = minutes;
//hours, minutes값 검증
Examine(); //총분수를 시간과 분으로 분리하는 메소드
}
private void Examine()
{
//hours와 minutes가 음수이면 예외발생
if(hours<0 || minutes<0)
throw new Exception("올바르지 않은 인자입니다");
//hours와 minutes가 범위를 벗어나는 경우
hours = hours + (minutes/60);
minutes = minutes%60;
}
//총분수를 반환
private int TotalMinutes()
{
return hours * 60 + minutes;
}
//ToString 오버라이드
public override string ToString()
{
return hours + ":" + minutes;
}
//++연산자 오버로딩(1분추가)
public static Time operator ++ (Time t)
{
return new Time(t.TotalMinutes()+1);
}
//+연산자 오버로딩(분 합산)
public static Time operator + (Time t1, Time t2)
{
return new Time(t1.TotalMinutes()+ t2.TotalMinutes());
}
}
class MainClass
{
[STAThread]
static void Main(string[] args)
{
Time t1 = new Time(10, 20);
t1++; //연산자 오버로딩시 피연산자(객체)안에서 오버로딩한다.
Console.WriteLine(t1);
Time t2 = new Time(1, 30);
Time t3 = t1 + t2;
Console.WriteLine(t3);
Console.Read();
}
}
관계형 연산자 오버로딩
- ==, <=, >=, <, >
- 관계형 연산자 오버로딩은 항상 쌍으로 해야한다.
- ==, != 연산자 오버로딩을 할때는 반드시 Equals메소드도 오버라이드 한다.
연산자 다중 오버로딩 [출처] [펌] [20040512] 연산자 오버로딩|작성자 눈꽃천사