[C#공부] 캐스팅 및 타입 변환
# 타입 변환(Type conversions)이란?
타입변환은 객체의 타입을 변환하는 것을 말한다.
어떠한 변수에 값을 복사할 때, 변수의 타입과 복사하고자 하는 값의 타입이 동일하다면 문제가 되지 않는다.
하지만 서로 타입이 다르다면, 값이 담겨질 변수의 타입으로 변환하여 값을 복사하여야 한다.
* int 타입의 변수 i에 string 값을 저장하려고하니 오류 메세지가 뜬다.
# 암시적 변환(Implicit Conversions)
특별한 구문이 필요없으며 숫자 타입간의 변환, 클래스 타입간의 변환이 가능하다.
- 숫자 타입의 변환
- 데이터 손실이 없는 경우의 변환.
ex) 예를 들어 byte 타입의 변수에 값을 복사하고자 할 때, 256이상의 값을 복사할 수 없다. (byte의 저장크기: 0~255)
- 클래스 타입간의 변환
- 파생클래스에서 기본클래스로의 변환.
# 명시적 변환(Explicit Conversions)
캐스트 연산자를 사용하여 변환 구문을 나타내며 숫자 타입간의 변환, 클래스 타입간의 변환이 가능하다.
* 캐스트 연산자 : (타입명)
- 숫자 타입의 변환
- 데이터 손실 가능성이 있는 경우의 변환.
- 클래스 타입간의 변환
- 기본클래스에서 파생클래스로의 변환.
- 단, 본래 자신의 타입에서 기본클래스로 변환이 된 클래스가 다시 파생(자신)클래스로 변환할 때만 가능.
사실 클래스 타입간의 변환에서 이러한 명시적 타입변환은 잘 사용되지 않는다. 왜냐면 위 코드처럼 'children = (Children)parent;'는 컴파일에서 에러가 발생하지 않지만 프로그램 실행에서 'InvalidCastException'이 발생한다. 그 이유는 parent 객체가 본래 Children 타입이 아니었기 때문이다. 이 코드에서 정상적으로 프로그램이 실행되게 하려면 'Parent parent = new Parent();' -> 'Parent parent = new Children();'으로 변경하면 된다. 그렇다면 "프로그램을 실행시키지 않고 타입변환이 정상적으로 이루어졌는지 확인할 수는 없을까?"라는 의문을 가질 수 있다. 그래서 'as/is 연산자'라는 것이 존재한다. *참고: [C#문법] as와 is 연산자
# 사용자 정의 변환(User-defined Conversions)
기본클래스-파생클래스 관계가 아닌 사용자 지정 타입 간의 변환을 위해 특수한 메소드를 정의하여 암시적/명시적 변환을 구현.
* 사용자 지정 타입 : 클래스 또는 구조체
- 암시적 변환
- 명시적 변환
# Helper Class를 사용한 변환(Conversions with helper classes)
- System.DateTime 객체, 16진수 문자열과 바이트 배열 등 호환되지 않는 타입간의 변환을 가능하게 함.
- System.BitConverter 클래스, System.Convert 클래스, Parse 메소드를 사용.
- System.BitConverter 클래스 사용
- 바이트 배열을 정수로 변환.
- System.Convert 클래스 사용
- 문자열(숫자 형태)을 숫자로 변환.
- 숫자 타입(int, long, float, double 등)에 있는 Parse() 사용
- 문자열(숫자 형태)을 숫자로 변환.
'Programming > C#' 카테고리의 다른 글
[C#공부] 배열/Collection을 이용한 foreach문 사용 (0) | 2018.01.06 |
---|---|
[C#공부] as와 is 연산자 (0) | 2018.01.06 |
[C#공부] Boxing & Unboxing (0) | 2018.01.06 |
[C#공부] C#과 닷넷 프레임워크의 개념 (0) | 2018.01.06 |
[개발환경 구축] Visual Studio 2017 Community 설치하기 (0) | 2018.01.06 |