호빵의 IT 개발소

[C#] 다형성 본문

C#, 유니티/C# 기초

[C#] 다형성

호빵Stack 2022. 1. 3. 23:51

다형성(Poly Morphism)

실제 타입에 따라 다양한 형태로 동작

 

다형성은 부모와 자식클래스에서 중복되는 함수 앞에 들어가는 virtual과 override만 잘 확인하면 됩니다.

class Player
{
    protected int hp;
    protected int attack;
    
    public virtual void Move()
    {
    	Console.WriteLine("Player 이동!");
    }
}

class Knight : Player
{
	public override void Move()
    {
    	Console.WriteLine("Knight 이동!");
    }
}

class Mage : Player
{
	public override void Move()
    {
    	Console.WriteLine("Mage 이동!");
    }
	public int mp
}

class Program
{
	static void EnterGame(Player payer)
    {
    	player.Move();
    
    	Mage mage = (player as Mage);
        if (mage != null)
        {
        mage.mp = 10;
        }
    }
    

	static void Main(string[] args)
    {
    	Knight knight = new Knight();
        Mage mage = new Mage();
        
        
        EnterGame(mage);
    }
}

예제를 보면 부모클래스에서 Move는 virtual이고 나머지 자식클래스 Move는 override입니다. 여기서 EntetGame함수에 player.Move();를 넣는다면 현재 mage가 들어가있기 때문에 mage안에 있는  public override void Move();가 실행되게 됩니다.

 

class Player
{
    protected int hp;
    protected int attack;
    
    public virtual void Move()
    {
    	Console.WriteLine("Player 이동!");
    }
}

class Knight : Player
{
	public override void Move()
    {
    	Console.WriteLine("Knight 이동!");
    }
}

class Mage : Player
{
	public int mp
}

class Program
{
	static void EnterGame(Player payer)
    {
    	player.Move();
    
    	Mage mage = (player as Mage);
        if (mage != null)
        {
        mage.mp = 10;
        }
    }
    

	static void Main(string[] args)
    {
    	Knight knight = new Knight();
        Mage mage = new Mage();
        
        
        EnterGame(mage);
    }
}

만약 class Mage에서 public override void Move();를 지우게 된다면 부모 클래스인 Player에서 public virtual void Move();가 실행됩니다.

 

여기서 public override void Move(); 와 부모 클래스에 public virtual void Move(); 두개 다 실행하고 싶다면 class Mage에서 base.Move();를 사용하면 부모 클래스에 있는 Move를 호출할 수 있게 됩니다. 부모 클래스가 먼저 호출되고 그다음 자식 클래스가 호출되게 됩니다.

 

※ 자식 클래스에서 override를 선언했다면 무조건 한번은 부모 클래스에서 virtual을 사용하여야 한다. 만약 2중 상속을 한다고 해도 부모의 부모 클래스(Player)에서 virtual을 가지고 있기 떄문에 override를 사용할 수 있습니다.

 

class Player
{
    protected int hp;
    protected int attack;
    
    public virtual void Move()
    {
    	Console.WriteLine("Player 이동!");
    }
}

class Knight : Player
{
	public sealed override void Move()
    {
    	Console.WriteLine("Knight 이동!");
    }
}

class SuperKnight : Knight
{
 //override 사용시 에러 발생
}

추가 sealed

sealde는 C#에서만 사용 가능합니다. 말 그대로 자기 자기자신까지만 override를 하고 그 뒤에 상속받는 자식은 override할 수없습니다.

 

 

---------------------------------------------------------------------------------------------------------------------------

참고 : [인프런] Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문

'C#, 유니티 > C# 기초' 카테고리의 다른 글

[C#] Generic(일반화), object  (0) 2022.01.09
[C#] 문자열  (0) 2022.01.04
[C#] 클래스 형식 변환  (0) 2022.01.03
[C#] 은닉성  (0) 2022.01.03
[C#] 상속성  (0) 2022.01.03
Comments