HaPpY hApPy

3. cast보다는 is나 as가 좋다. 본문

.NET/Effective C#

3. cast보다는 is나 as가 좋다.

juniguya 2013. 8. 17. 12:59

캐나다에서 몇년간 영어공부만 하다가 코딩을 다시 할때 젤 웃겻던게 is, as 문법이다 ㅎㅎ

그리고 이제 시간이 조금 지나 사용할 때마다 아주 키워드 이름을 잘 지은거 같다. ㅎㅎ 직관적이라 좋다.


형 변환성 가능성 체크 는 is로 하고

형 변환은 as로 하면된다.


is, as 는 사용자가 정의한 형변환 연산자의 존재를 고려하지 않기 때문에 런타임의 수행성능 효율도 좋다.


as 와 cast의 효율은 밑에서 비교해보자

as

object o = Factory.GetObject();

// Version one:

MyType t = o as MyType;

if (t != null)

{

// work with t, it's a MyType.

}

else

{

// report the failure.

}


case

object o = Factory.GetObject();

// Version two:

try

{    

MyType t;

t  = (MyType)o;

// work with T, it's a MyType.

}

catch (InvalidCastException)

{

// report the conversion failure.

}

null은 어떠한 reference 타입으로도 변환이 되기때문에

as던 cast던 둘다 null인지 비교는 해야되지만 as는 try catch 문을 사용하지 않아도 된다.


또한 as는 일관되게 작동하지만 cast는 double 자료형을 정수형 자료형을 변환하면서 소수점이 날라갈수있어

이런건 은행에서 프로그래밍 하면 나중에 이자, 환율 등 0.1 0.2 의 차이로 엄청난 차이가 발생할수있다.


얼마전 친구가 한말이 생각난다.

은행에 db 쿼리 검색하다가 하나가 잘못되어있어서 몇년동안 수십억치의 이자를 못받았다고 했다.

이 부분을 은행 윗사람에게 보고해야될지 말아야될지 담당책임자(은행쪽)과 얘기를 하는데,

그 과장이, 이 일이 터지면 자기부터 시작해서 윗 사람들 다 짤린다며,,,-_-ㅋ

여튼 그땐 무슨말인지 몰랐는데, 아마 저런거와 비슷한게 아닌가 싶다. ㅋㅋ

(이거,,,나중에 문제 생기는 글은 아니겠찌 - 0 -)


마지막으로 상속받은곳에서도 캐스팅이나 as는 작동한다, 이럴때는 GetType() 을 이용하자,

이는 정확히 런타임에 일치해야만 작동한다(상속 관계도 안된다)