ITEM 3 :: EFFECTIVE C#


안녕하세요, 세번째 시간입니다.


평일에 작성하는 것은 어느정도의 피곤함을 동반하는 일이라는 것을 알고는 있었지만, 벌써부터 지쳐갑니다…

하지만, 이럴 때 일수록 열심히 해야겠죠!

3번째 아이템은 바로, 캐스트보다는 is, as가 더 낫다 입니다.

간단한 설명과, 장점과 단점, 그리고 정리하여 전체적으로 서술 하겠습니다. 이번에도 역시 먼저, 설명부터.

설명

먼저 캐스트 연산과 is,as 연산에 대해서 알아야 한다. 일단 캐스트(Cast)와 is as는 강제 형변환 연산이다. 하지만 결국 강제 형변환 연산은 어느정도 위험성을 가지고 있는데, 형변환을 할 때 값이 소실되거나, 변형될 가능 성을 가지고 있다는 것이다. 그럼에도 강제 형변환 연산을 해야할 경우가 있는데, 그 때 Cast 연산을 사용하곤 한다. C와 C++에서부터 사용하던 Cast연산, C#역시 사용하나, C#은 조금 다른 방식을 권한다.

그것이 바로, is, as 연산이다.

간단하게 그 차이를 알아보겠다.

is,as와 cast연산의 차이

  1. Cast는 강제 형 변환을 할 때 try Catch를 사용하여 형 변환에 대해 예외처리를 해주어야, 사용할 수 있다.
  2. Cast는 어떤 상황에서든지 null로 변환될 수 있기 때문에 조건문을 사용하여 그부분에 대한 예외처리가 필요하다.
try
{
    PracticeClass pco = (PracticeClass)obj; // cast사용
    if (pco != null)
    {
        // 널이 아니므로 객체 사용
    }
    else
    {
        // null일 경우 오류 보고
    }
}
catch
{
    // 형 변환 예외처리
}


PracticeClass pco = obj as PracticeClass; // as 사용
if (pco != null)
{
    // 널이 아니므로 객체 사용
}
else
{
    // null일 경우 오류 보고
}
  1. as는 사용 시에 Try/Catch구문을 사용하지 않아도 된다.
  2. as는 형변환이 100% 이루어진다(어차피 안되면 컴파일 에러가 나므로!)
  3. is 키워드는 as와 같으나, 어쩔 수 없이 강제 형변환일 경우에 사용한다!
  4. as 키워드는 변환할 타임이 reference형 일때만 사용할 수 있다. 즉, value 타입은 as키워드를 사용하여 형변환할 수 없고, 이럴 때 강제 형변환을 해야되는데, 이 경우에 is를 쓴다는 것이다.
  5. 하지만 위에서와 같이 강제 형 변환을 할 때에는 형 변환 수행에 대한 확실성이 없어 이에대한 가능여부를 미리 살펴봐야 하기 때문에 is 키워드를 사용한다.

정리

즉, as연산자를 사용하여 Reference타입의 형 변환을 할 경우 안된다면 아예 컴파일에러를 내버리기 때문에 형 변환 보장에 대해서 확실해져, Try Catch문이 필요가 없어진다! 그래서, 가독성도 좋아진다! 거기에 강제 형변환을 사용할 경우에는 is키워드를 사용하면서 형변환을 추가로 보장해주면 되기 때문에, Cast를 사용하는 것보다 is와 as를 사용하는 것이 C#에서는 좋다!!!!