다음을 통해 공유


명시적 변환

업데이트: 2007년 11월

명시적 변환은 언어에 따라 다르게 변환을 수행하는 방법입니다. 일부 컴파일러에서는 축소 변환을 지원하려면 명시적 변환이 필요합니다.

공용 언어 런타임을 대상으로 하는 대부분의 언어는 명시적 변환을 지원하지만, 실제 메커니즘은 언어마다 각기 다릅니다. 공용 언어 런타임을 대상으로 하는 일부 언어에서는 특정 변환을 명시적으로 수행해야 하지만 다른 언어에서는 동일한 변환이 암시적으로 수행될 수도 있습니다. 마찬가지로 일부 언어에서는 일정한 조건(예: Visual Basic에서 Option Strict가 설정된 경우)이 충족되면 특정 변환을 명시적으로 수행해야 하지만 다른 조건(예: Visual Basic에서 Option Strict의 설정이 해제된 경우)에서는 변환이 암시적으로 수행될 수도 있습니다. 명시적 변환에 대한 자세한 내용은 사용 중인 언어의 설명서를 참조하십시오.

C# 및 C++와 같은 일부 언어에서는 캐스팅을 사용하여 명시적 변환을 수행합니다. 데이터 형식은 수행되는 변환의 형식을 지정하는데, 이 데이터 형식을 변환 앞에 붙이면 캐스팅이 발생합니다. Visual Basic 등의 다른 언어에서는 변환 함수를 호출하여 명시적 변환을 수행합니다. Visual Basic에서는 CType 함수를 사용하거나 CStr 또는 CInt 등의 특정 형식 변환 함수 중 하나를 사용하여 암시적으로는 허용되지 않는 데이터 형식 변환을 명시적으로 수행할 수 있습니다.

대부분의 컴파일러에서는 검사 변환 방식이나 비검사 변환 방식으로 명시적 변환을 수행할 수 있습니다. 검사 변환을 수행하는 경우 변환되는 형식의 값이 대상 형식의 범위를 벗어나면 OverflowException이 throw됩니다. 동일한 상황에서 비검사 변환을 수행하면 변환된 값으로 인해 예외가 발생하지는 않지만 정확한 동작이 정의되지 않으며 잘못된 값이 나타날 수 있습니다.

참고:

C#에서 검사 변환을 수행하려면 캐스팅 연산자와 함께 checked 키워드를 사용하거나 /checked+ 컴파일러 옵션을 지정합니다. 반대로 비검사 변환을 수행하려면 캐스팅 연산자와 함께 unchecked 키워드를 사용하거나 /checked- 컴파일러 옵션을 지정합니다. 기본적으로 명시적 변환은 검사되지 않습니다. Visual Basic에서 검사 변환을 수행하려면 프로젝트의 고급 컴파일러 설정 대화 상자에서 정수 오버플로 검사 해제 확인란의 선택을 취소하거나 /removeintchecks- 컴파일러 옵션을 지정합니다. 반대로 비검사 변환을 수행하려면 프로젝트의 고급 컴파일러 설정 대화 상자에서 정수 오버플로 검사 해제 확인란을 선택하거나 /removeintchecks+ 컴파일러 옵션을 지정합니다. 기본적으로 명시적 변환은 검사됩니다.

다음 예제에서는 Int32.MaxValueByte 값으로 변환하여 검사되지 않는 C# 캐스트를 보여 줍니다. 정수 값이 대상 Byte 데이터 형식의 범위를 벗어나지만 변환으로 인해 OverflowException이 throw되지 않습니다.

// The integer value is set to 2147483647.
int myInt = int.MaxValue;
try
{
   byte myByte = (byte)myInt;
   Console.WriteLine("The byte value is {0}.", myByte);
}
catch (OverflowException)
{
   Console.WriteLine("Unable to convert {0} to a byte.", myInt);
}   
// The value of MyByte is 255, the maximum value of a Byte.
// No overflow exception is thrown.

다음 예제에서는 Visual Basic의 검사되는 CByte 함수를 사용한 명시적 변환과 C#의 checked 키워드를 사용한 검사되는 캐스팅을 보여 줍니다. 이 예제에서는 Int32.MaxValueByte 값으로 변환합니다. 그러나 Int32.MaxValueByte 데이터 형식의 범위에서 벗어나므로 OverflowException이 throw됩니다.

' The integer value is set to 2147483647.
Dim myInt As Integer = Integer.MaxValue
Try
   Dim myByte As Byte = CByte(myInt)
   Console.WriteLine("The byte value is {0}.", myByte)
Catch e As OverflowException
   Console.WriteLine("Unable to convert {0} to a byte.", myInt)
End Try   
' Attempting to convert Int32.MaxValue to a Byte 
' throws an OverflowException.
// The integer value is set to 2147483647.
int myInt = int.MaxValue;
try
{
   byte myByte = checked ((byte) myInt);
   Console.WriteLine("The byte value is {0}.", myByte);
}
catch (OverflowException)
{
   Console.WriteLine("Unable to convert {0} to a byte.", myInt);
}   
// Attempting to convert Int32.MaxValue to a Byte 
// throws an OverflowException.

명시적 변환의 결과는 언어마다 다를 수 있으며 해당 Convert 메서드의 동작에 따라서도 다를 수 있습니다. 명시적 변환 동작에 대한 내용은 사용 중인 언어의 설명서를 참조하십시오. 예를 들어 Visual Basic에서 CInt 함수를 사용하여 Double 값을 Int32 값으로 변환하면 반올림이 수행됩니다. 하지만 C#에서 명시적 변환을 사용하여 동일한 변환을 수행하는 경우 소수점 오른쪽의 값은 무시됩니다. 다음 코드 예제는 명시적 변환을 사용하여 Double 형식을 정수 형식의 값으로 변환합니다.

Dim myDouble As Double = 42.72
Dim myInt As Integer = CInt(myDouble)
Console.WriteLine(myInt)
' myInt has a value of 43.
Double myDouble = 42.72;
int myInt = checked ((int)myDouble);
Console.WriteLine(myInt);
// myInt has a value of 42.

참고 항목

참조

System.Convert

기타 리소스

형식 변환