ITEM 3 : Cast 보다 is 나 as 연산자를 선호해라

|

ITEM 3. Prefer the is or as operators to Casts

           (Cast 보다 is 나 as 연산자를 선호해라.)



■  is 또는 as 사용의 장점


1.      형변환에 방어적인 기법이 있다. 우선 is 연산자로 변환이 가능한지 확인 한 후에 as casts로 형 변환을 하는 것이다.


2.      형변환을 할 때마다 as 연산자를 사용하는 것이 좋은 선택이다. as 연산자가 cast 연산자를 사용하는 것 보다 더 안정적이고

       런타임에 더 효율적이다.


3.      as 연산자를 사용하면 try/catch 구문이 필요 없다, 따라서 코드가 간결하며 부하가 줄어든다.


4.      as 연산자와 cast 연산자의 가장 큰 차이점은 사용자 정의 변환의 처리이다.(as는 사용자가 정의한 연산을 허용하지 않는다),

       as is는 변환시에 요청 타입이 아니거나 파생된  타입이면 변환에 실패한다. 하지만 cast는 요청타입으로 변환을 한다.

       (long에서 short으로 변환이 가능하며 정보가 손실이 발생한다.)


5.      as 연산자는 value type의 변환은 불가능하다. 그 이유는, 변환에 실패하면 null을 반환한다. 

      초기화 변환 실패시 value type null을 넣어야 하는데, value type null값이 올 수가없다.


6.      is 연산자는 as 연산자를 쓸 수 없을때만 써라, 그렇지 않는 경우에는 불필요하다.



■ Cast 연산자가 필요한 경우


1.    value type의 변환이 필요하면 Cast 연산자가 필요하다. as 연산자는 value type의 변환은 불가능하다


2.    사용자 정의 변환(user-defined operator)는 cast 만 가능하다.

       cast 연산자는 컴파일 타임에 코드를 생성하기 때문에, 변환 시도 시에 코드상에 있는 형태로부터 변환하려는 타입으로 변환을

       시도한다. 런타임의 타입은 모른다. 따라서 컴파일 타임에 object에서 원하는 타입으로 실패하면 컴파일러는 런타임에 object 타입이

       변환하려는 타입인지만 확인하는 코드를 생성한다.  (아래에 자세히 설명함)


3.      foreach 구문에서 타입 변환은 cast로 된다.(배열에서 임시값의 타입으로 변경시에), foreach에서 value type과 참조타입이

      모두 올 수 있기 때문이다따라서 InvalidCastException이 발생할 수 있다.


■ * 사용자 정의 연산자(user-defined type)의 cast가 실패하는 경우

    

*아래는 SecondType에서 implicit 으로 사용자 정의 연산자를 정의 했다. 

public class SecondType
{
     private MyType _value;

   public static implicit operator MyType(SecondType t)
   {
      return t._value;
   }
}

object o = Factory.GetObject();
// o is a SecondType:

MyType t = o as MyType; // Fails. o is not MyType

if (t != null)
{
    // work with t, it's a MyType.
}
else
{
   // report the failure.
}

// Version two:
try
{
    MyType t1;
    t1 = (MyType)o; // Fails. o is not MyType
    // work with t1, it's a MyType.
}
catch (InvalidCastException)
{
   // report the conversion failure.
}

  =>위의 변환 둘다 실패한다.

  

  첫번째 버전은, as는 런타임의 타입으로 결정이 되므로, 런타임에 o가 SecondType이므로 Mytype또는

   Mytype에서 파생된 클래스가 아니므로 실패를 하게된다. 사용자 정의 연산자가 존재 하기는 하지만, 위에서 언급한 것 처럼

   as는 사용자 정의 연산자를 허용하지 않기 때문에 실패한다.


  두번째 버전은, 처음에 보면 o가 SecondType이므로 사용자 정의 연산자에 의해서 Mytype으로 변환이 가능 한 것 처럼 보인다.

  하지만 이것도 실패한다. cast 연산자는 컴파일 타임에 코드를 생성하기 때문에, 변환 시도 시에 코드상에 있는 Object Type에서

  Mytype으로 변환을 시도한다. Object에는 Mytype으로 변환하는 사용자 정의 연산자가 정의 되지 않았기 때문에 실패한다. 컴파일

  타임에 실패하면, 컴파일러는 런타임의 o가 Mytype인지만 검사하는 코드를 생성한다. 따라서 런타임에는 o가 Secondtype이므로

  Secondtype은 Mytype이 아니기 때문에 실패한다.


■ Terms


1.      implicit 한정자 vs explicit 한정자 : implicit은 캐스팅을 하지 않아도 컴파일러가 알아서 변환을 하게 하는 것이며,

       explicit은 캐스팅을 했을때만 변환이 가능하므로 임의적으로 컴파일러가 변환을 하지 못하게 한다

       보통 implicit은 변환에 의한 손실이 전혀 없을 때 사용한다.


■ 해석이 모호하거나 중요한 구문


1.      By embracing C#, you’ve embraced strong type

       (C#을 채택함에 따라서, 당신은 강력한 타입을 수용했다)


2.      Strong typing means you expect the compiler to find type mismatches in your code

      (강력한 타입은 컴파일러가 당신의 코드에서 타입의 불일치를 찾을 수 있는것을 예상하는 것을 의미한다.)

      =>강력한 타입은 컴파일러가 타입 불일치를 발견할 수 있는 것을 의미한다.


3.      That also means your applications do not need to perform as much type checking at runtime

      (그것은 또한 당신의 어플리케이션이 런타임에 타입체크를 하는 것처럼 수행이 필요 없는 것을 의미한다.)?


4.      Use the as operator or force the compiler to bend to your will using a cast

      (as 연산자를 사용하거나 컴파일러가 당신이 as를 사용하는 것을 따르도록 강요하는 것이다)

=>as 연산자를 사용하거나 강제로 cast를 사용하는 것이다.


5.      The as and is operators do not perform any user-defined conversions. 

( as is 연산자들은 어떠한 사용자 정의 변환도 수행하지 않는다) ?


6.      If a particular object is not the requested type or is derived from the requested type, they fail.

(특정한 객체가 요청타입이 아니거나 요청 타입으로 부터 파생된 타입이 아니면 실패한다.=>파생된 타입은 성공이 되어야 한다. 오타인듯)

cf)해석본에서는 객체가 변환 요청된 타입(???)이거나, 변환 요청된 타입으로부터 상속된 타입이 아닐경우 실패한다로 나옴테스트가 필요

 => 테스트 해본 결과 객체가 변환 요청된 타입이 아니거나, 변환 요청된 타입으로 부터 파생된 객체가 아니면 실패한다.


■ 단어


1.      embrace : ()안다, 포옹하다/받아들이다/수용하다/포괄하다,아우르다

2.      embarrassed : 당황스러운,어색한

3.      expect A to +V : A V하기를 기대[예상]하다

4.      as much ~ as : ~ 만큼, ~ 못지 않게

5.      as much : 그것도 동일한것

6.      there will be time ~: ~ 시간이 올 것이다. cf)There will be time when you succeed.

7.      bend to  his will : 그의 뜻에 따르다

8.      variant : 이형(다른형태)/변종

9.      and then : 그리고 후에/ 그리고 나서

10.    blindly : 앞이 안보이는 채/맹목적으로, 무턱대고

11.    sought : SEEK 의 과거/과거 분사형

12.    arbitrary : 임의적인, 제멋대로인/독단적인.

13.    luck:숨어있다. (위험이)도사리다. cf)lurking : 숨어있는

14.    snippet : (작은)정보

15.    consistent : 일관된,~와 일치하는.

16.    redundant : 정리 해고당한/불필요한,쓸모없는

17.    coercion : 강제

18.    eligible :~을 가질 수 있는


■ 피드백


    이 챕터는 해석이 어려운 부분이 많았다. [해석이 모호하거나 중요한 구문]의 6번 항목은 원서와 번역본의 내용이 달라서 실제로 테스트

    소스로 테스트 해보니 둘다 오타가 있는거 같았다. (--;)


    결론은


   value type의 변환과 사용자 정의 변환을 제외한 다른 모든 부분에서는 is 나 as를 이용해서 변환을 하면 된다.

And