[C#] as, is

2024. 6. 25. 20:08·Game Programming/C#
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
반응형
저작자표시 비영리 변경금지 (새창열림)

'Game Programming > C#' 카테고리의 다른 글

[C#] 얕은 복사 vs 깊은 복사 (Shallow Copy vs Deep Copy)  (0) 2024.06.29
[C#] 의존성 주입(DI, Dependency Injection)  (0) 2024.06.29
[C#] Delegate  (0) 2024.06.25
[C#] 가변 파라미터, 선택적 인수, 명명된 인수  (0) 2024.06.25
[C#] Null 조건 연산자  (0) 2024.06.25
'Game Programming/C#' 카테고리의 다른 글
  • [C#] 얕은 복사 vs 깊은 복사 (Shallow Copy vs Deep Copy)
  • [C#] 의존성 주입(DI, Dependency Injection)
  • [C#] Delegate
  • [C#] 가변 파라미터, 선택적 인수, 명명된 인수
리태s
리태s
게임 클라이언트 프로그래머 직무를 준비하며 공부한 내용을 정리한 블로그입니다.
    반응형
    250x250
  • 리태s
    LeeTaes 공부노트
    리태s
  • 전체
    오늘
    어제
    • Home (165)
      • 프로젝트 (20)
        • Isaac 3D (5)
        • TimelessAdventure (13)
        • FruitsPuzzle (2)
      • Game Programming (25)
        • C# (8)
        • Unity Engine (6)
        • Unreal Engine (8)
        • UE_Multiplayer (3)
      • 코딩테스트 (111)
        • 프로그래머스 (Lv. 0) (27)
        • 프로그래머스 (Lv. 1) (31)
        • 프로그래머스 (Lv. 2) (21)
        • 백준 (Study) (29)
        • 알고리즘 (3)
      • CS지식 (7)
        • 운영체제 (7)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    구현
    Unreal Engine
    CS지식
    코딩테스트
    delegate
    Summer/Winter Coding
    fruitspuzzle
    2019 kakao
    unrealengine
    프로젝트
    timelessadventure
    2022 kakao
    project t.a develop
    Algorithm
    프로세스
    청년취업사관학교
    fsoftobjectpath
    tsoftobjectptr
    sesac
    2018 kakao
    pcce 기출문제
    issac3d
    후기
    c#
    ai controller
    백준
    unity
    프로그래머스
    C++
    dataasset
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
리태s
[C#] as, is
상단으로

티스토리툴바