checked 및 unchecked 문(C# 참조)

checkedunchecked 문은 정수 계열 형식 산술 연산 및 변환에 대한 오버플로 검사 컨텍스트를 지정합니다. 정수 산술 오버플로가 발생하면 오버플로 검사 컨텍스트가 수행되는 동작을 정의합니다. 검사 컨텍스트인 경우 System.OverflowException이 throw됩니다. 상수 식에서 오버플로가 일어나면 컴파일 시간 오류가 발생합니다. 비검사 컨텍스트에서는 대상 형식에 맞지 않는 상위 비트를 삭제하여 작업 결과가 잘려집니다. 예를 들어 추가의 경우 최댓값에서 최솟값으로 래핑됩니다. 다음 예에서는 확인된 컨텍스트와 확인되지 않은 컨텍스트 모두에서 동일한 작업을 보여 줍니다.

uint a = uint.MaxValue;

unchecked
{
    Console.WriteLine(a + 3);  // output: 2
}

try
{
    checked
    {
        Console.WriteLine(a + 3);
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

참고 항목

오버플로가 발생한 경우 사용자 정의 연산자 및 변환의 동작은 이전 단락에서 설명한 것과 다를 수 있습니다. 특히 사용자 정의 검사 연산자는 검사 컨텍스트에서 예외를 throw하지 않을 수 있습니다.

자세한 내용은 산술 연산자 문서의 산술 오버플로 및 0으로 나누기사용자 정의 검사 연산자 섹션을 참조하세요.

식에 대한 오버플로 검사 컨텍스트를 지정하려면 다음 예제와 같이 checkedunchecked 연산자를 사용할 수도 있습니다.

double a = double.MaxValue;

int b = unchecked((int)a);
Console.WriteLine(b);  // output: -2147483648

try
{
    b = checked((int)a);
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

checkedunchecked 문과 연산자는 다음 예제와 같이 문 블록 또는 연산자의 괄호 안에 ‘텍스트’가 있는 작업에 대한 오버플로 검사 컨텍스트에만 영향을 줍니다.

int Multiply(int a, int b) => a * b;

int factor = 2;

try
{
    checked
    {
        Console.WriteLine(Multiply(factor, int.MaxValue));  // output: -2
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);
}

try
{
    checked
    {
        Console.WriteLine(Multiply(factor, factor * int.MaxValue));
    }
}
catch (OverflowException e)
{
    Console.WriteLine(e.Message);  // output: Arithmetic operation resulted in an overflow.
}

앞의 예제에서 Multiply 로컬 함수의 첫 번째 호출은 예외가 throw되지 않으므로 checked 문이 Multiply 함수 내의 오버플로 검사 컨텍스트에 영향을 주지 않는다는 것을 보여 줍니다. Multiply 함수의 두 번째 호출에서 함수의 두 번째 인수를 계산하는 식은 검사된 컨텍스트에서 계산되고 checked 문의 블록 내에 텍스트가 포함되므로 예외를 발생시킵니다.

오버플로 검사 컨텍스트의 영향을 받는 작업

오버플로 검사 컨텍스트는 다음 작업에 영향을 줍니다.

기본 오버플로 검사 컨텍스트

오버플로 검사 컨텍스트를 지정하지 않으면 CheckForOverflowUnderflow 컴파일러 옵션의 값이 비상수 식에 대한 기본 컨텍스트를 정의합니다. 기본적으로 이 옵션의 값은 설정되지 않으며 정수 형식 산술 연산 및 변환은 비검사 컨텍스트에서 실행됩니다.

상수 식은 기본적으로 검사 컨텍스트에서 평가되며 오버플로의 경우 컴파일 시간 오류가 발생합니다. unchecked 문 또는 연산자를 사용하여 상수 식에 대해 비검사 컨텍스트를 명시적으로 지정할 수 있습니다.

C# 언어 사양

자세한 내용은 C# 언어 사양의 다음 섹션을 참조하세요.

참고 항목