C Sharp Rookiss Part1 기초 프로그래밍 입문 : 클래스 형식 변환
🙇♀️클래스 형식 변환
- 자식에서 부모, 부모에서 자식
- 자식에서 부모는 100 가능
- 부모에서 자식은 모른다
- 참조할 경우 에러
- 명시적으로 표시하면 에러가 사라짐
class Player
{
protected int hp;
protected int attack;
}
class Knight : Player
{
}
class Mage : Player
{
public int mp;
}
class Program
{
static void Main(string[] args)
{
Mage mage = new Mage();
Player playerMage = mage; // 자식에서 부모로!
Mage mage2 = (Mage)playerMage; // 명시적으로 표시!
}
}
컴파일해야 알수있는 에러
class Program
{
static void EnterGame(Player player)
{
Mage mage = (Mage)player;
mage.mp = 10;
}
static void Main(string[] args)
{
Knight knight = new Knight();
Mage mage = new Mage();
EnterGame(knight);
}
}
- Mage와 Knight는 Player의 자식
- EnterGame에서 player는 Knight이지만 Mage로 명시
- 에러 메시지가 뜨지 않아서 실행
- Knight에 없는 mp를 불러오려했기에 크래쉬가 남
🪐is
- 에러 고치기
static void EnterGame(Player player)
{
bool isMage = (player is Mage);
if (isMage)
{
Mage mage = (Mage)player;
mage.mp = 10;
}
}
- is를 사용해 bool 값으로 Mage를 체크 후 함수 실행
- is는 bool을 반환한다
🪐as
- 에러 고치기
static void EnterGame(Player player)
{
Mage mage = player as Mage;
if (mage != null)
{
mage.mp = 10;
}
}
- as를 사용해 캐스팅후 함수 실행
- as는 캐스팅까지 한다
- 보통 is보다 as를 사용함
- 캐스팅을 못하면 null을 반환
전체코드
namespace CSharp
{
class Player
{
protected int hp;
protected int attack;
}
class Knight : Player
{
}
class Mage : Player
{
public int mp;
}
class Program
{
static void EnterGame(Player player)
{
Mage mage = player as Mage;
if (mage != null)
{
mage.mp = 10;
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
Mage mage = new Mage();
Player playerMage = mage;
Mage mage2 = (Mage)playerMage;
EnterGame(knight);
}
}
}