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


아이템 3 : 캐스트 보다는 is, as 좋다
  • 형변환을 수행하는 경우 캐스팅을 사용하기보다 as 연산자를 사용하는 것이 좋다. As 사용하는 편이 안전하거니와 런타임에 효율적으로 동작한다. 다만 as is 연산자를 사용하면 사용자 정의 형변환은 수행되지 않는다. => 런타임에 객체의 타입이 변환하려는 타입과 정확히 일치할 경우에만 형변환이 성공적으로 수행된다. 형변환 과정에서 새로운 객체가 생성되는 경우는 거의 없다.

  • 예외적으로 as 연산자를 이용하여 박싱된 타입의 객체를 nullable 타입의 객체로 변환하는 경우 새로운 객체가 생성된다.

 


2 개의 예시 코드를 비교해보면 번째 예시가 읽기도 편하고 try/catch 문이 없어 빠르다. As, is 런타임에 객체의 타입을 확인하고 필요에 따라 박싱을 수행하는 것을 제외하고는 어떤 작업도 수행하지 않는다.

 임의의 객체가 형변환되기 위해서는 객체는 지정한 타입이거나 혹은 타입을 상속한 타입이어야 한다.

 반면 캐스팅의 경우는 객체를 지정한 타입으로 변환하기 위해서 형변환 연산자가 개입될 있다. (형변환 실패시 바로 에러를 던지는)




코드에서 번째, 번째 형변환 코드는 전부 실패.
번째 경우는 o CastType 아니기 때문
번째 경우는 SecondType 에서 CastType으로 변환하는 연산자가 있더라도, 형변환 연산자를 통해 객체가 런타임에 어떤 타입일지 없기 때문. 컴파일러는 단순히 컴파일 타임에 객체가 어떤 타입으로 선언됐는지만 추적한다. 따라서 형변환 연산자는 런타임에 object 타입의 o 객체가 CastType으로 변환이 가능한지 고려하지 않는다.

  • 형식을 변환할


  • 때로는 임의의 객체를 다른 타입으로 형변환 가능한지뿐 아니라 객체의 정확한 타입을 알고 싶을 때도 있다. Is 연산자는 다형성polymorphism 규칙을 준수하기 때문에 특정 객체가 상속한 타입에 대해서 확인할 때도 true 반환한다.
  • 이에 반해 GetType() 메서드는 런타임에 객체의 타입을 정확히 가져온다. 메서드는 is as 문장이 제공하는 수준 이상으로 엄격히 검사할 사용한다.

댓글

이 블로그의 인기 게시물

Unity - Dialogue 시스템을 구현할 때 유용한 무료 에셋

Unity - 메타 파일

Unity - 라이브러리 폴더