본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 24. 연산자 오버로딩

함수 오버로딩은 다른 행동을하는(파라미터를 달리하여) 같은 이름을 가진 함수를 만드는것이다.


연산자오버로딩은 여기서 함수가 아닌 연산자를 오버로딩 하는것이다.


1, 연산자 오버로딩

말그대로 연산자를 오버로딩하는것
사용자 정의 자료형이기때문에 기존 연산자
(+, -, *, /, %, … 등)을 사용하지 못한다.
그러나 연산자 오버로딩을 통하여 사용가능하게 할수있다


1p 와 2p모두를 지원하는 게임을 제작하는중에

보스몬스터를 만났을때 1p,2p 모드 둘다 같은 체력과 스피드의 보스가 나오면

1p로 할때 너무 어렵고 2p로 할때 너무 쉬운 상황이 발생할꺼같아

2p로 할때 보스의 체력을 1P + 2P로 하고싶다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
class Character
{
private int hp;

public Character(int hp)
{
this.hp = hp;
}

public Character SumHPCharacter (Character a)
{
Character newCharacter = new Character(this.hp + a.hp);
return newCharacter;
}

}

class Program
{
static void Main(string[] args)
{
Character mario = new Character(3);
Character luigi = new Character(2);

Character Koopa = mario.SumHPCharacter(luigi);
}
}
}

두 캐릭터의 합을 캐릭터를 리턴해주는 함수를 만들어서

그것으로 보스 몬스터 koopa를 만들어주었다.


딱봐도 거지코드니까 static으로 만들어서 사용해보자

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
class Character
{
private int hp;

public Character(int hp)
{
this.hp = hp;
}

public static Character SumHPCharacter (Character a, Character b)
{
Character newCharacter = new Character(a.hp + n.hp);
return newCharacter;
}


}

class Program
{
static void Main(string[] args)
{
Character mario = new Character(3);
Character luigi = new Character(2);

Character Koopa = Character.SumHPCharacter(mario,luigi);
}
}
}

그래도 괜찮게 나왔다.

이제 잘 프로그래밍 하고있었는데


클라이언트가 4p게임으로 확장하고 싶댄다.

그래서 4p로 플래이하면 4명의 캐릭터의 합으로 해주어야한다.


static void Main(string[] args)
{
Character mario = new Character(3);
Character luigi = new Character(2);
Character wario = new Character(3);
Character waluigi = new Character(2);

Character Koopa = Character.SumHPCharacter(
waluigi,Character.SumHPCharacter(
wario,Character.SumHPCharacter(mario,luigi)));
}

와우...


이런짓을 하기 싫으면

SumHpCharacter함수를 오버라이딩 해서 4명짜리도 만들어주어야한다.


아니 오지게 귀찮다...


지금까지 사용한 int형 double형 기타 등등은

int a = 1;
int b = 1;
int c = 1;
int d = 1;
int e = a + b + c + d;

요런식으로 사용가능했느데


캐릭터도

그냥

static void Main(string[] args)
{
Character mario = new Character(3);
Character luigi = new Character(2);
Character wario = new Character(3);
Character waluigi = new Character(2);

Character Koopa = mario + luigi + wario + waluigi;
}


요렇게 쓰면 얼마나 편할까..


이럴때 연산자 오버로딩을 하면된다.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
class Character
{
private int hp;

public int Hp
{
get { return hp; }
}

public Character(int hp)
{
this.hp = hp;
}


public static Character operator + (Character a, Character b)
{
return new Character(a.hp + b.hp);
}

}

class Program
{
static void Main(string[] args)
{

Character mario = new Character(3);
Character luigi = new Character(2);
Character wario = new Character(3);
Character waluigi = new Character(2);

Character Koopa = mario + luigi + wario + waluigi;
Console.WriteLine(Koopa.Hp);
}
}
}



operator 키워드를 이용해서 연산자 오버로딩을 할수있다.


C++ 처럼 다할수있느건 아니고.. 일종의 c++의 프랜드 함수형식으로 오버로딩되는 느낌으로 코딩하고

일종의 제약들이 몇개 있는데


간단한 사항은 다음주소에서 확인하면된다.

https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/statements-expressions-operators/overloadable-operators


기본적으로 public, static으로 선언해야한다.



728x90