본문 바로가기
프로그래밍/Effective C#

Effective C# Item 3 : 캐스트보다는 is, as가 좋다

by bantomak 2023. 9. 26.

캐스트보다는 is, as가 좋다

C#은 정적 타이핑을 수행하는 언어다. 따라서 코드 작성시에 타입 불일치가 발생하면 컴파일러가 걸러주기 때문에 런타임에 타입 검사를 자주 수행할 필요가 없다. 하지만 간혹 런타임에 반드시 타입을 확인해야 하는 경우도 있다. C#의 경우 .NET Framework에서 정의해둔 메서드를 원형에 따라 object타입의 인자를 취하도록 메서드를 정의해야 하는 경우가 간혹 있다. 통상 이렇게 전달된 매개변수는 다른 클래스나 인터페이스로 형변환을 수행한 후 사용하게 된다. C#에서 형변환을 수행하는 방법에는 as 연산자를 사용하는 방법과 컴파일러의 캐스트 연산자 구문을 사용하는 두 가지 방법이 있다. 더 방어적인 코드를 작성하려는 경우에는 우선 is 연산자로 형변환이 가능한지를 확인한 후에 실제 형변환을 수행하도록 코드를 작성할 수도 있다.

 

형변환을 수행하는 경우 캐스팅을 사용하기보다 as 연산자를 사용하는 것이 좋다. as를 사용하는 편이 더 안전하기도 하거니와 런타임에 더 효율적으로 동작한다. 다만 as나 is 연산자를 사용하면 사용자 정의 형변환은 수행되지 않는다. 이런 이유로 런타임에 객체의 타입이 변환하려는 타입과 정확히 일치할 경우에만 형변환이 성공적으로 수행된다. 형변환 과정에서 새로운 객체가 생성되는 경우는 거의 없다.(예외적으로 as 연산자를 이용하여 박싱 된 값 타입의 객체를 nullable 값 타입의 객체로 변환하는 경우 새로운 객체가 생성된다.)

 

간단한 예를 살펴보자. 다음의 코드는 임의의 객체를 MyType으로 형변환한다.

 

다음과 같이 코드를 작성할 수도 있다.

 

 

첫 번째 코드가 작성하기도 쉽고 읽기도 편하다. try/catch 문이 없기 때문에 성능도 좋다. 캐스팅을 사용한 두 번째 코드의 경우 언뜻 보아 반환값의 null 여부를 확인할 필요가 없는 듯 보이지만, null은 어떤 참조 타입으로도 형변환 될 수 있기 때문에 반환값이 null인지를 여전히 확인해야 한다. as 연산자는 형변환을 수행할 수 없거나, null을 대상으로 형변환을 수행하는 경우 null을 반환한다. 이러한 이유로 캐스팅을 사용하면 예외처리 코드와 null 확인 코드가 모두 필요하지만 as 연산자를 사용하면 null 확인 코드만 있으면 된다.

 

as 연산자와 캐스팅을 가장 큰 차이는 사용자 정의 형변환을 어떻게 다루는가 하는 점이다.

as나 is 연산자는 런타임에 객체의 타입을 확인하고 필요에 따라 박싱을 수행한다. 임의의 객체를 다른 타입으로 형변환하려면 이 객체는 지정한 타입이거나 혹은 지정한 타입을 상속한 타입이어야 한다. 그 이외의 경우는 모두 실패한다.

 

캐스팅을 사용하는 경우에는 객체를 지정한 타입으로 변환하기 위해서 형변환 연산자가 개입될 수 있다. 대표적인 형변환 연산자가 바로 숫자 타입에 대한 형변환 연산자이다. (Long타입을 short 타입으로 캐스팅하면 일부 정보를 잃을 수도 있다는 것은 이미 잘 알려진 사실이다.)

 

함께 읽으면 좋은 글

 

C# is, as, typeof(), GetType() Type-testing 연산자에 대해서

is 연산자 is 연산자는 식 결과의 런타임 형식이 지정된 형식과 호환되는지 확인합니다. 결과값으로 true, false를 반환합니다. Java에서는 동일한 기능을 제공하는 instanceof를 사용한다. Syntax expression

jettstream.tistory.com

 

출처

 

이펙티브 C# - 예스24

더 나은 C# 코드를 작성하는 새로운 방법 50가지 C#은 전통적인 .NET 기반 개발에서 유니티 게임 엔진으로 개발 영역을 확대하면서 더욱 주목받고 있다. 또한 자마린으로 다양한 모바일 플랫폼에

www.yes24.com

댓글