C#

[C#]checked, unchecked 키워드

DevStory 2021. 12. 29.

checked와 unchecked 키워드란?

C#에서 checkedunchecked 키워드를 간략하게 설명하자면 정수 타입의 오버플로우 검사를 처리하기 위해 사용됩니다. 자세한 설명은 예제를 통해 살펴보도록 합니다.

 


오버플로우란?

오버플로우(overflow)는 정수 타입의 값이 해당 범위를 초과한 경우 예외를 발생시키지 않고 예상치 못한 결과 또는 쓰레기 값을 제공합니다.

 

C#의 정수형은 총 10가지 타입이 존재합니다.

☞ .Net 공식문서 정수 타입 링크

sbyte 타입으로 설명드리자면, sbyte 타입이 표현할 수 있는 값은 -128 ~ 127 범위의 값입니다. sbyte 타입이 표현할 수 있는 최댓값은 127, 최솟값은 -128이며, 최댓값 127을 벗어나는 값을 할당하면, 오버플로우라고 합니다.

 

반대로 최솟값 -128보다 작은 값을 할당하면, 언더플로우(underflow)라고 합니다.

 

C#에서는 다음과 같이 타입의 MinValueMaxValue 속성을 사용하여 각 타입의 최솟값과 최댓값을 확인할 수 있습니다.

Console.WriteLine(sbyte.MinValue);
// -128
Console.WriteLine(sbyte.MaxValue);
// 127

Console.WriteLine(int.MinValue);
// -2147483648
Console.WriteLine(int.MaxValue);
// 2147483647

checked 키워드

checked 키워드는 정수 타입의 연산 및 변환 과정에서 발생하는 오버플로우 검사를 명시적으로 활성화하는데 사용됩니다.

 

▶ checked 키워드를 사용하지 않는 경우

다음은 checked 키워드를 사용하지 않는 예제입니다. 정수 타입인 int형으로 변수를 선언하고 변수 ab는 int형이 표현할 수 있는 최댓값으로 초기화합니다. 그리고 변수 c에는 a + b의 결과를 할당합니다.

int a = 2147483647;
int b = 2147483647;
int c = a + b;

Console.WriteLine(c);
// -2

콘솔로 변수 c의 값을 확인하면 예상하지 못한 결과인 -2가 출력됩니다. 기본적으로 C#은 정수에 대한 산술 오버플로우를 검사하지 않기 때문에 오류 또는 예외가 발생하지 않았습니다.

 

▶ checked 키워드를 사용하는 경우

다음은 checked 키워드를 사용합니다.

int a = 2147483647;
int b = 2147483647;

int c = checked(a + b);

Console.WriteLine(c);

프로그램을 실행하면 a + b의 결과는 int형이 표현할 수 있는 최댓값을 벗어나므로 OverflowException이 발생합니다.

 

추가적으로 다음과 같이 언더플로우인 경우에도 OverflowException이 발생합니다.


unchecked 키워드

unchecked 키워드는 정수 타입의 연산 및 변환 과정에서 발생하는 오버플로우 검사를 억제하는데 사용됩니다. 즉, 오버플로우가 발생하여 원하지 않는 결과 또는 쓰레기 값을 제공하더라도 컴파일러는 오버플로우 검사를 하지 않습니다.

 

▶ unchecked 키워드를 사용하는 경우

다음은 unchecked 키워드를 사용한 예제입니다.

int a = 2147483647;
int b = 2147483647;
int c = unchecked(a + b);

Console.WriteLine(c);
// -2

unchecked 키워드를 사용하여 반환된 값은 기본 컴파일러가 동작하는 방식과 거의 동일한 방식이라는 것을 확인할 수 있습니다.

 

▶ unchecked 키워드가 필요한 경우

다음은 unchecked 키워드의 필요성을 설명하는 예제입니다. 변수 abconst 키워드를 사용하여 상수로 선언합니다.

const int a = 2147483647;
const int b = 2147483647;

int c = a + b;

Console.WriteLine(c);

프로그램을 컴파일하면 다음과 같이 오류가 발생합니다.

 

정상적으로 동작되도록 unchecked 키워드를 사용합니다.

const int a = 2147483647;
const int b = 2147483647;

int c = unchecked(a + b);

Console.WriteLine(c);
// -2

코드를 수정 후 컴파일하면 정상적으로 실행되는 것을 알 수 있습니다. 원하지 않는 결과 또는 쓰레기 값을 제공하더라도 프로그램이 정상적으로 실행되어야 하는 경우 unchecked 키워드를 사용합니다.

반응형

댓글