C#은 컴파일 시간에 정적으로 형식화되므로 변수가 선언된 이후 다시 선언되거나 다른 형식의 값을 저장하는 데 사용할 수 없다.
(이말인즉슨 int 형을 string 형으로 변환할 수는 없다는 의미이다.)
그러나 다른 형식의 변수 또는 메서드 매개 변수에 값을 복사해야 하는 경우도 있다.
(예를 들어 매개 변수가 float 으로 형식화된 메서드에 int값을 가진 정수형 변수를 전달하는 경우)
C#에서 형식 변환은 다음의 4가지 방법에 의해 수행된다.
- 암시적 변환
- 명시적 변환
- 사용자 정의 변환
- 도우미 클래스를 사용한 변환
암시적변환
작은 범위에서 -> 큰 범위로 변환 / 파생클래스에서 -> 기본 클래스로 변환 (형식이 안전하고 데이터 손실 위험이 없다.)
int-> float, gameObject -> object , transform -> component -> object (이런 경우 특수 구문이 필요하지 않다.)
명시적변환
큰 형(기본 클래스) -> 작은 형(파생 클래스)으로의 변환 (정보가 손실되거나 다른 이유로 변환이 실패할 수 있다.)그래서 cast란 것을 해야하는데 (cast : 컴파일러에서 (<Type>) 캐스트라는 특수구문을 거쳐 명시적 변환을 수행)
이것은 변환을 수행하고자 할때 어떤 데이터의 손실 가능성을 짐작해 컴파일러에게 명시적으로 알리는 방법이다.
컴파일러는 런타임에 객체가 어떤 타입일지 예측하지 못한다. 그래서 일부 참조 변환 시 컴파일러에서 캐스트가 유효한지 확인할 방법이 없는데
이경우에 오류메시지 없는 컴파일 단계의 캐스트 작업이 런타임에서는 실패를 유발할 수 있다.
-> 따라서 실제 캐스트 수행 전 호환성을 테스트할 수 있는 is및 as 연산자를 사용해 안정성 여부를 확보해야 한다.
다음과 같은 상속관계에 있는 클래스 구도에서의 is 및 as 연산자를 사용하는 경우를 살펴보자
이처럼 is 연산자는 보안성을 입증하는데 문제없지만 객체의 실제 타입을 파악하기 위해 상속관계를 탐색하며 각 타입을 조사해야 한다.
이것은 성능에 관한 비용을 발생시키므로 -> (성능 개선의 이유로) as 연산자를 사용할 것을 (effective c#) 책에서 권고하고 있다.
'Programming > C++, C#' 카테고리의 다른 글
[C#] Const vs Readonly (0) | 2018.06.06 |
---|---|
[C#] 박싱과 언박싱 (0) | 2018.06.06 |
[C#] 값 타입 vs 참조 타입 (0) | 2018.06.05 |
클래스(정적멤버) (0) | 2018.06.05 |
클래스(생성자) (0) | 2018.06.04 |