is와 as를 이용한 안전한 다운 캐스팅

강성원·2023년 11월 30일
0

C# 끄적끄적

목록 보기
7/11
post-thumbnail

C++에서는 C스타일 형변환 (ex) (Child)parent), 혹은 dynamic_cast를 통해서 안전한 다운 캐스팅을 한다.
C#에서는 어떠한 방식으로 안전한 다운 캐스팅을 할까 찾아보니 is와 as 라는 키워드를 사용한다고 한다.

다운 캐스팅 : 부모 타입의 참조 변수를 자식 타입으로 변수로 형변환 하는 것.
(부모 클래스 : Bug / 자식 클래스 : Dragonfly)

  • 다운 캐스팅 가능한 경우
    • 부모 클래스 타입의 참조 변수(bug)가 자식 클래스의 인스턴스를 가리키고 있어서 모든 멤버에는 접근하지 못하지만 문제는 없다.
    • bug를 자식 클래스 타입(Dragonfly)으로 캐스팅해도 문제될 것이 없다.
  • 다운 캐스팅 불가능한 경우
    • 부모 클래스의 인스턴스를 가리키는 참조변수를 자식 클래스로 캐스팅하면 문제가 생긴다.
    • bug에게 있어서 Bug 클래스 만큼의 영역은 아는 부분이지만 Dragonfly 클래스의 부분은 전혀 모르는 곳이다.
    • Dragonfly 클래스의 참조형 변수 dragonfly에 bug를 캐스팅하여 복사해도 Bug 부분 외에는 접근 불가하다.
    • 실행하면 잘못된 접근으로 오류가 땋 나면서 프로그램이 뻗는다.

해결책 : is / as

안전하게 캐스팅 하고 캐스팅에 실패하면 다른 값을 뱉어주게 도와주는 is와 as가 있다.

is

  • is는 참조형 변수의 캐스팅 가능 여부에 대해 boolean 타입의 결과를 뱉어준다.
  • is는 캐스팅 가능 여부만 알려줄 뿐이지 후속 작업은 알아서 하는 것을 잊지말자.
  • is는 참조형 뿐 아니라 값 형식(int, float, ...)도 테스트 할 수 있다.

as

  • as는 캐스팅하고자 하는 타입의 결과물로 반환해준다.
    실패하면 null을 반환한다.
  • dragonflyt에 담겨진 반환 값이 null인지 아닌지를 판단하여 사용한다.

C#은 형변환도 참 매끄럽다..

참고
ms 공식 문서 : 패턴 일치와 is 및 as 연산자를 사용하여 안전하게 캐스트하는 방법

profile
개발은삼순이발

0개의 댓글