| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 차이점
- 인프런
- rookiss
- MonoBehaviour
- 큐
- c#
- std::unordered_map
- 자료구조
- 프래그멘테이션
- vector
- 스택영역
- map
- Queue
- 스택
- 배열
- 트리
- thread
- 해쉬맵
- std::map
- 알고리즘
- 객체지향
- list
- static_cast
- 멀티쓰레드
- 공부
- 리스트
- 기술면접
- 벡터
- 힙영역
- 반복문
- Today
- Total
호빵의 IT 개발소
[C#] 다형성 본문
다형성(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 |