함수 오버로딩은 다른 행동을하는(파라미터를 달리하여) 같은 이름을 가진 함수를 만드는것이다.
연산자오버로딩은 여기서 함수가 아닌 연산자를 오버로딩 하는것이다.
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으로 선언해야한다.