Purpose-built post
이 포스트는 "Effective C#, Item #3, cast보다는 is나 as가 좋다"를 읽고 개인적인 생각을 정리하기 위한 용도로 만들었다. - 익필
Content
제목에서 말해 주듯, type을 변환 할 땐 cast 보다는 is 나 as를 써서 변환하는게 더 좋다 설명한 장이다. cast, is, as 에 대해서 문법 적으로 알고 있어야 하는데, 간단하게 정리해 본다.
1. 무엇을 cast 연산자 라고 하는가?
C 형태의 캐스트를 말한다. 예를 들어 다음과 같다.
2. 무엇을 is 연산자 라고 하는가?
is 연산자는 타입이 변환 될 수 있다/없다를 판단하기 위해서 사용 된다, is 연산자의 리턴값은 true/false 이다. 코드는 링크를 보자.
참조 링크
3. 무엇을 as 연산자 라고 하는가?
as 연산자는 타입을 변환 시키기 위해 사용 되며, 만약 변환이 안된다면, null 을 리턴한다.
참조 링크
cast 연산자들이 무엇이며, 어떻게 쓰이는지 알아 봤는다. 그렇다면 왜 이 책에선 C 스타일 보다 as 나 is 가 더 좋다고 하는 것일까? 책 내용을 정리하자면 다음과 같다.
이유 1. cast 연산시 코드 길이가 짦아져, 작성하기 편하고 읽기도 쉽다.
코드를 보면, as 사용 전 후를 확인해 볼 수 있을 것이다. c 스타일의 경우, try ~ catch 를 null 체크를 하여도 써야 하지만 as 는 쓰지 않아도 되는 장점이 있다.
이유 2. c 스타일 보다 as 가 더 빠르다.
as 와 is의 경우, 사용자가 정의한 "형변환 연산자"를 고려 하지 않기 때문에, 더 빠르다.(책에 이렇게 나와 있다.)
이유 3. 일관되게 동작하는 cast를 만들 수 있다.
여기서 "일관되게 동작하는게 좋다"를 알아야 하는데, 쉽게 말해, 예측이 가능하기 때문이다. 왜 일관 될까? c 스타일 cast 연산자의 경우, 사용자가 정의한 형변환을 고려 하기 때문에, 변환시 "사용자 정의 형변환 연산자"가 있느냐 없느냐에 따라서 바뀌지만, as 연산자는 고려하지 않기 때문이다.
사설 : 이것은 약간 이상하다. 무엇이 이상하냐면, 일관된다는 것에 관계 없이, 형변환 한다는 것 자체가, 변환이 실패 할 수도 있다는 것을 전제 하기 때문에, 타입 변환이 안될 경우에 대해서, 무조건 처리를 해 두어야 하기 때문에, 일관성과 관계가 없다.
그렇다고 모두 as를 쓸 수는 없다.
왜냐하면 as를 쓰지 못할 경우가 있기 때문이다. as는 value 타입에 대한 형변환을 수행 할 경우이다. 이때는 is 와 혼합을 하여 c 스타일 cast 를 해야 한다. 또 foreach 를 사용 할 때는 내부적으로 c 스타일 cast를 이용한다. 왜냐하면, value 와 reference 타입 둘다 형 변환을 해야 하기 때문이다.
is 와 혼합하여 value 타입을 변환 하는 방법
Digression
- C# 에서 사용자 정의 형변환 연산자는 적용 할만한 곳이 적다. 는 것을 알았다. 왜 적냐면, object 타입일 경우, 사용자 정의 형변환 연산자가 무엇인지 컴파일러가 알 길이 없기 때문이다.
- 이번 아이템 마지막 부근에 GetType() 에 대해서 언급 하지만, 아는게 귀찮아서 그냥 넘긴다. 왜 귀찮냐면, 아이템 9에서 자세히 다룬다고 하기 때문이다.
'책 정리 > Effective C#' 카테고리의 다른 글
item 10, GetHashCode()의 함정을 유의하라 (0) | 2010.06.27 |
---|---|
item 9, ReferenceEquals(), static Equals(), instance Equals(), operator==의 상호 연관성을 이해해라. (0) | 2010.06.26 |
item 8, value 타입을 사용할 때 0이라는 값이 의미를 가질 수 있도록 하라 (0) | 2010.06.24 |
item 7, immutable atomic value 타입이 더 좋다 (0) | 2010.06.23 |
item 6, value 타입과 reference 타입을 구분하라. (0) | 2010.06.20 |
Item 5, 항상 ToString()을 작성하라. (0) | 2010.06.11 |
item 4, #if 대신 Conditional Attribute를 사용하라. (0) | 2010.06.05 |
Item 2, const 보다는 readonly가 더 좋다 (0) | 2010.04.02 |
Item 1, 데이터 멤버 대신에 항상 프로퍼티를 사용하라 (0) | 2010.03.31 |
Effective C# 을 읽는다. (711) | 2010.03.30 |
최근댓글