🙇‍♀️클래스 형식 변환

  • 자식에서 부모, 부모에서 자식
    • 자식에서 부모는 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);
        }
    }
}

태그:

카테고리:

업데이트: