본문 바로가기
C#

C# - 연산자 오버로드

by 개발 그리고 게발 2021. 7. 8.
728x90

C#에서는 연산자를 개발자 임의로 오버로드해서 사용할 수 있도록 되어 있습니다.

 

특정한 클래스의 값에 대해 연산을 적용할 경우 조건부로 값을 걸어서 원하는 값이 나오도록 설정할 수 있습니다.

 

+, -, >, <, != 등의 연산자를 특정한 이유로 조건부에 따라 값을 변경해야 할 때 다음과 같이 사용할 수 있습니다.

 

각 연산자 별로 파라미터에 (OperaterOvl op, DataType parameter), (DataType parameter, OperaterOvl op)을 좌우 둘다 구현한 이유는 다음과 같은 경우에도 값을 동일하게 처리하기 위함 입니다.

 

OperaterOvl op = new OperaterOvl();

int plus = op + 100;

// + 연산자에 대해 좌우 케이스를 둘다 적용하지 않을 경우
// plus2값을 구하는 상황에서 컴파일 에러 발생
int plus2 = 100 + op;

 

 


 

연산자 오버로드 클래스

public class OperaterOvl
{
	private string _opVal = "METHOD";
	private int _opNum = 500;

	// + 연산자를 사용할 때 100이 넘어가는 수를 더하면 0으로 만들어버리자
	// Ex) op._opNum + 3
	public static int operator +(OperaterOvl op, int num)
	{
		if (num > 100)
			num = 0;

		return op._opNum + num;
	}

	// + 연산자를 사용할 때 100이 넘어가는 수를 더하면 0으로 만들어버리자
	// Ex) 3 + op._opNum
	public static int operator +(int num, OperaterOvl op)
	{
		if (num > 100)
			num = 0;

		return op._opNum + num;
	}

	// - 연산자를 사용할 때 100이 넘어가는 수를 빼면 100을 빼주자
	// Ex) op._opNum - 3
	public static int operator -(OperaterOvl op, int num)
	{
		if (num > 100)
			num -= 100;

		return op._opNum - num;
	}

	// - 연산자를 사용할 때 100이 넘어가는 수를 빼면 100을 빼주자
	// Ex) 3 - op._opNum
	public static int operator -(int num, OperaterOvl op)
	{
		if (num > 100)
			num -= 100;

		return op._opNum - num;
	}

	// 이하의 연산자는 +, -를 사용한 방법과 마찬가지로 원하는 조건을 넣어서 사용가능합니다
	public static bool operator ==(OperaterOvl op, string txt)
	{
		return op._opVal == txt;
	}

	public static bool operator ==(string txt, OperaterOvl op)
	{
		return txt == op._opVal;
	}

	public static bool operator !=(OperaterOvl op, string txt)
	{
		return op._opVal == txt;
	}

	public static bool operator !=(string txt, OperaterOvl op)
	{
		return txt != op._opVal;
	}

	public static bool operator >(OperaterOvl op, int num)
	{
		return op._opNum > num;
	}

	public static bool operator >=(OperaterOvl op, int num)
	{
		return op._opNum > num;
	}

	public static bool operator <=(OperaterOvl op, int num)
	{
		return num != op._opNum;
	}

	public static bool operator <(OperaterOvl op, int num)
	{
		return num != op._opNum;
	}

	// ==, !=를 오버로드 하기때문에 Equals함수도 같이 구현합시다
	// 하지 않을 경우 클래스에 경고줄 발생
	public override bool Equals(object obj)
	{
		return base.Equals(obj);
	}

	// 아래의 함수를 구현하지 않을경우 경고줄이 생기기 때문에 구현하도록 합시다
	public override int GetHashCode()
	{
		return base.GetHashCode();
	}
}

 

실제 사용 예시

OperaterOvl op = new OperaterOvl();

// 결과값 : 500
int plus = op + 200;

// 결과값 : 500
int plus2 = 200 + op;

// 결과값 : 400
int minus = op - 200;

// 결과값 : 150
int minus2 = 200 - 50;

// 결과값 : true
bool okay = op == "METHOD";
bool okay2 = "METHOD" == op;

// 결과값 : false
bool not_okay = op == "CLASS";
bool not_okay2 = "CLASS" == op;
728x90

댓글