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 연산자를 사용하여 안전하게 캐스트하는 방법