C#은 정적 타이핑을 수행하는 언어다. 따라서 타입 불일치가 발생하더라도 컴파일러가 이를 걸러주
기 때문에 런타임에 타입 검사를 자주 수행할 필요가 없다. 하지만 간혹 런타임에 반드시 타입을 확
인해야 하는 경우도 있다. C#의 경우 .NET Framework에서 정의해둔 메서드의 원형에 따라 object 타
입의 인자를 취하도록 메서드를정의해야 하는 경우가 간혹 있다. 통상 이렇게 전달된 매개변수는 다
른 클래스나 인터페이스로 형변환을 수행한 후 사용하게 된다.
C#에서 형변환을 수행하는 방법에는 as 연산자를 사용하는 방법과 컴파일러의 캐스트 연산자 구문
을 사용하는 두 가지 방법이 있다. 더 방어적인 코드를 작성하려는 경우에는 우선 is 연산자로
형변환이 가능한지 를 확인한 후에 실제 형변환을 수행하도록 코드를 작성할 수도 있다.
형변환을 수행하는 경우 캐스팅을 사용하기보다 as 연산자를 사용하는 것이 좋다. as를 사용하는 편
이 더 안전하기도 하거니와 런타임에 더 효율적으로 동작한다.
다만 as나 is 연산자를 사용하면 사용자 정의 형변환은 수행되지 않는다. 이런 이유로 런타임에 객체
의 타입이 변화하려는 타입과 정확히 일치할 경우에만 형변환이 성공적으로 수행된다.
형변환 과정에서 객체가 생성되는 경우는 거의 없다.
(예외적으로 as 연산자를 이용하여 박싱된 값 타입의 객체를 nullable 값 타입의 객체로 변환하는 경우 새로운 객체가 생성된다.)
object o = Factory.GetObject();
// 첫 번째 버전:
MyType t = o as MyType;
if (t != null)
{
// MyType 타입의 t 객체 사용
}
else
{
// 오류보고
}
다음과 같이 코드를 작성할 수도 있다.
object o = Factory.GetObject();
// 두 번째 버전:
try
{
MyType t;
t = (MyType) o;
// MyType 타입의 t 객체 사용
}
catch (InvalidCastException)
{
// 오류 보고
}