확대 변환과 축소 변환(Visual Basic)

형식 변환 시 변환 결과가 대상 데이터 형식의 범위 내에 있는지 여부를 중요하게 고려해야 합니다.

확대 변환은 원래 데이터의 가능한 값을 허용할 수 있는 데이터 형식으로 값을 변경합니다. 확대 변환은 원본 값을 유지하지만 표현을 변경할 수 있습니다. 이 문제는 정수 계열 형식에서 Decimal으로 변환하거나 Char에서 String로 변환하는 경우에 발생합니다.

축소 변환 은 가능한 값의 일부를 저장하지 못할 수도 있는 데이터 형식으로 값을 변경합니다. 예를 들어 소수 자릿수 값은 정수 형식으로 변환될 때 반올림되고 Boolean로 변환되는 숫자 형식은 둘 중 하나 True 또는 False으로 줄어듭니다.

확대 변환

다음 표에서는 표준 확대 변환을 보여 줍니다.

데이터 형식 데이터 형식 1로 확장
SByte SByte, Short, Integer, Long, Decimal, Single, Double
Byte Byte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double
Short Short, Integer, Long, Decimal, Single, Double
UShort UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double
정수 Integer, Long, Decimal, Single, Double2
UInteger UInteger, Long, ULong, Decimal, Single, Double2
Long Long, Decimal, Single, Double2
ULong ULong, Decimal, Single, Double2
10진수 Decimal, Single, Double2
Single Single, Double
double Double
열거형 형식(열거형) 기본 정수 계열 형식과 기본 형식이 확장되는 모든 형식입니다.
Char Char, String
Char 배열 Char 배열, String
모든 형식 Object
모든 파생 형식 파생된 모든 기본 유형3.
모든 형식 구현하는 모든 인터페이스입니다.
없음 모든 데이터 형식 또는 개체 형식입니다.

1 정의에 따라 모든 데이터 형식이 그 자체로 확장됩니다.

2Integer, UInteger, Long, ULong, Decimal에서 Single 또는 Double로 변환하면 정밀도는 손실될 수 있지만 크기는 손실되지 않을 수 있습니다. 이러한 의미에서 정보 손실이 발생하지 않습니다.

3 파생 형식에서 기본 형식 중 하나로의 변환이 확대되는 것은 놀라운 일이 될 수 있습니다. 파생 형식은 기본 형식의 모든 멤버를 포함하므로 기본 형식의 인스턴스로 한정됩니다. 반대 방향으로 기본 형식에는 파생 형식으로 정의된 새 멤버가 포함되지 않습니다.

확장 변환은 항상 런타임에 성공하며 데이터 손실이 발생하지 않습니다. Option Strict 문에서 형식 검사 스위치를 On이나 Off로 설정할지 여부에 관계없이 항상 암시적으로 수행할 수 있습니다.

축소 변환

표준 축소 변환에는 다음이 포함됩니다.

  • 앞의 표에서 확대 변환의 역방향(모든 형식이 자체적으로 확대됨 제외)

  • 부울과 숫자 형식 간의 어느 방향으로든 변환

  • 모든 숫자 형식에서 열거형 형식으로 변환(Enum)

  • 문자열과 숫자 형식,Boolean, 날짜 사이의 어느 방향으로든 변환

  • 데이터 형식 또는 개체 형식에서 파생된 형식으로 변환

축소 변환이 런타임에 항상 성공하는 것은 아니며 실패하거나 데이터 손실이 발생할 수 있습니다. 대상 데이터 형식이 변환되는 값을 받을 수 없는 경우 오류가 발생합니다. 예를 들어 숫자 변환으로 인해 오버플로가 발생할 수 있습니다. Option Strict 문이 형식 검사 스위치를 Off으로 설정하지 않는 한 컴파일러는 암시적으로 축소 변환을 수행할 수 없습니다.

참고 항목

컬렉션의 For Each…Next 요소에서 루프 컨트롤 변수로 변환하는 경우 축소 변환 오류가 표시되지 않습니다. 자세한 내용 및 예제는 For Each...Next 문의 “축소 변환” 섹션을 참조하세요.

축소 변환을 사용하는 경우

원본 값을 오류나 데이터 손실 없이 대상 데이터 형식으로 변환할 수 있는 경우 축소 변환을 사용합니다. 예를 들어 String에 “True” 또는 “False”가 포함된 것으로 알고 있는 경우 CBool 키워드를 사용하여 Boolean으로 변환할 수 있습니다.

변환 중 예외

확대 변환은 항상 성공하기 때문에 예외를 throw하지 않습니다. 축소 변환은 실패할 때 가장 일반적으로 다음 예외를 throw합니다.

  • InvalidCastException - 두 형식 간에 변환이 정의되지 않은 경우

  • OverflowException — 변환된 값이 대상 형식에 비해 너무 큰 경우(정수 형식에만 해당)

클래스 또는 구조체가 해당 클래스나 구조체에서 변환 연산자로 사용할 CType 함수를 정의하는 경우 CType은 적절한 것으로 간주되는 예외를 throw할 수 있습니다. 또한 CType은 Visual Basic 함수 또는 .NET Framework 메서드를 호출하여 다양한 예외를 throw할 수 있습니다.

참조 형식 변환 중 변경 내용

참조 형식에서 변환하면 값에 대한 포인터만 복사됩니다. 값 자체는 어떤 방식으로도 복사되거나 변경되지 않습니다. 변경할 수 있는 유일한 것은 포인터를 보유하는 변수의 데이터 형식입니다. 다음 예제에서 데이터 형식은 파생 클래스에서 기본 클래스로 변환되지만 두 변수가 가리키는 개체는 변경되지 않습니다.

' Assume class cSquare inherits from class cShape.  
Dim shape As cShape  
Dim square As cSquare = New cSquare  
' The following statement performs a widening  
' conversion from a derived class to its base class.  
shape = square  

참고 항목