LeeTaes 공부노트

[C#] as, is 본문

Game Programming/C#

[C#] as, is

리태s 2024. 6. 25. 20:08
728x90
반응형

as / is

as 키워드는 특정 객체가 주어진 형식으로 변환 가능한지를 안전하게 확인할 때 사용됩니다.

주어진 객체를 지정된 형식으로 변환하려고 시도하며 변환에 실패하면 null을 반환합니다.

 

is 키워드는 특정 객체가 주어진 형식과 호환되는지를 확인하는데 사용됩니다.

주어진 객체가 호환이 되는 경우 true, 아닌 경우 false를 반환합니다.

 

다음과 같이 Character를 상속받는 Player, Monster 클래스가 있다고 가정해보도록 하겠습니다.

class Character
{
    public Character(string name)
    {
        Name = name;
    }

    public string Name { get; set; }

    public void PrintName()
    {
        Console.WriteLine(Name);
    }
}

class Player : Character
{
    public Player(string name) : base(name) { }

    public void Attack()
    {
        Console.WriteLine("플레이어 공격!");
    }
}

class Monster : Character
{
    public Monster(string name) : base(name) { }

    public void Defense()
    {
        Console.WriteLine("몬스터 방어!");
    }
}

 

Character타입으로 플레이어와 몬스터를 관리하고자 한다면 각각의 Attack(), Defense() 함수를 사용하지 못하게 됩니다.

static void Main(string[] args)
{
    Character player = new Player("톰");
    Character monster = new Monster("제리");
    
    // 현재 타입은 Character이므로 Player, Monster의 함수 사용 불가
    // player.Attack() - (X)
    // monster.Defense() - (X)
}

 

이때, 다운 캐스팅을 통해 Character타입의 객체를 Player, Monster 타입으로 형변환이 가능하며, as/is 키워드를 사용하여 형변환이 가능한지 체크할 수 있습니다.

 

static void Main(string[] args)
{
    Character player = new Player("톰");
    Character monster = new Monster("제리");

    // 플레이어 타입으로 형변환 (형변환에 실패하면 null 리턴)
    Player p = player as Player;
    if (p != null)
    {
        p.Attack();
    }

    // monster 객체가 Monster 타입으로 형변환하는지 체크 (가능하면 true, 불가능하면 false)
    if (monster is Monster)
    {
        // 강제 형변환(Character -> Monster)
        Monster m = (Monster)monster;
        m.Defense();
    }
}

 

위와 같이 as, is 키워드를 사용해 형변환이 가능하지만, 강제 형변환은 최대한 피하는 것이 좋으므로 as 키워드를 사용하는 것을 추천합니다.

728x90
반응형