[c#/.net] cast vs is , as 공부하기

as
as 연산자는 캐스트 연산과 비슷하지만 변환이 가능하지 않은 경우에 as를 사용하면 예외가 발생하지 않고 대신 null이 반환됩니다.
as 연산자는 오직 참조 변환과 boxing 변환만을 수행합니다
출처 : msdn.microsoft.com

즉 as 를 사용하여 변환을 하였다면 그 값이 null 인지를 체크하여 제대로 변환 여부를 따져보면 됩니다. 또한 as 를 사용하기전 가능여부는 is 를 사용하여 확인하고 변환을 시도하면 됩니다.

여기서 참조 변환 과  boxing 변환이란 .....

 boxing은 값 형식을 object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 프로세스입니다.
  int i = 123;
  object o = (object)i;  // boxing
출처 : msdn.microsoft.com


is
지정된 형식과 개체가 호환되는지 검사합니다. 예를 들어, 다음과 같이 개체가 string 형식과 호환되는지 확인할 수 있습니다.
if (obj is string)
{
}
출처 : msdn.microsoft.com

반면 cast 경우를 살펴본다면 ...
 
  • 명시적 변환(캐스트): 명시적 변환에는 캐스트 연산자가 필요합니다. 이 경우 소스 및 대상 변수가 호환되지만 대상 변수의 형식이 소스 변수보다 작은 경우(또는 소스 변수의 기본 클래스인 경우) 데이터가 손실될 위험이 있습니다.

출처 : msdn.microsoft.com

데이터 손실이 있을경우 cast 에서는 InvalidCastException 을 발생시킵니다. 이 에러는 foreach 를 사용했을 경우도 내부 cast 연산을 사용하기때문에 같은 에러가 발생합니다.
좀더 자세히 본다면..
 
 foreach 문은 cast 연산을 수행하므로 System.Object 를 collection 내에 존재하는 객체의 런타임 자료형으로 형변환할수 있는지 테스트하지 않는다. 단지 System.Object를 foreach 문 내에서 선언된 자료형으로 변환 할수 있는지만 테스트하게 된다.

출처 : Effective C#
즉 object 인 형태를 선언한 형태로 변형가능한지 여부만을 판단한다는 말.


as , is 와 cast 에 차이점.

1. as 와 is 연산자는 사용자가 정의한 형변환 연산자의 존재를 고려하지 않기 때문에 런타임의 수행성능 효율도 좋다. as 와 is 연산자는 런타임에 정확한 타입의 변환이 가능할 때에만 형변환을 수행한다. 또한 형변환을 수행하기 위해서 새로운 객체를 만들거나 하지 않는다.
2. 사용자가 정의한 형변환 연산자를 어떻게 다루는지. 
    as 나 is 연산자는 런타임에 객체의 형변환이 가능한지를 확인하기 위해서 사용자가 정의한 형변환 연산자를 전혀 고려하지 않는다. as 나 is를 이용하여 형변환을 시도하면 객체가 변환 요청된 타입이거나 변환 요청된 타입으로부터 상속된 타입이 아닌 경우 실패하게 된다
    cast 연산을 수행하는 코드를 사용하게 되면 컴파일러는 객체를 변환 요청된 타입으로 변경할 수 있는 다양한 형변환 연산자를 고려하여 형변환을 수행하는 코드를 만들어낸다.
출처 : Effective C#

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://syj8.egloos.com/tb/2336190 [도움말]

덧글

덧글 입력 영역



메모장_구글

세상에 좋은 결정인지 아닌지
미리 아는 사람은 아무도 없어.
우리가 할 수 있는 건 다만,
어떤 결정을 했으면
그게 좋은 결정이었다고
생각할 수 있게
노력하는 일뿐이야