카테고리 없음

🌟 C# checked, unchecked😋 🌟

minsoungdev 2026. 8. 5. 16:45

안녕하세요. 박민성입니다. ☺️

 

오늘은 C#의 checked, unchecked에 대해서 글을 쓰고자 합니다. 🤔

C# 관련해서 찾아보면서 공부하다가 처음 보는 checked, unchecked가 있어서 공부하고 

블로그를 쓰게 되었습니다.

 

1. 오버플로우란?

일단 checked, unchecked를 알기 전에 오버플로우를 알아야 합니다.

int number = int.MaxValue; // 2147483647
number++;

오버플로우란 정해진 범위를 초과하는 것을 말합니다.

오버플로우 검사가 꺼진 상황에서는 값이 반대쪽 범위로 순환할 수 있습니다.

2147483647 + 1
-> -2147483648

정확히 오버플로우는 정수 계산 결과가 해당 자료형이 표현할 수 있는 범위를 벗어나는 현상입니다.

 

2. checked란?

checked는 정수 계산이나 형변환에서 오버플로가 발생하는지 검사합니다.

checked
{
    int number = int.MaxValue;
    number++;
}

오버플로가 발생하면 OverflowException 예외가 발생합니다.

여기서 try catch를 사용해서 체크할 수 있습니다.

try
{
    checked
    {
        int number = int.MaxValue;
        number++;
    }
}
catch (OverflowException)
{
    Debug.Log("정수 범위를 초과했습니다.");
}

 

3. unchecked란?

unchecked는 오버플로 검사를 하지 않도록 명시하는 키워드입니다.

unchecked
{
    int number = int.MaxValue;
    number++;

    Debug.Log(number); // -2147483648
}

예외가 발생하지 않고 값의 비트가 정해진 크기를 넘어가면서 순환합니다.

 

checked를 사용하면 예외가 발생하지만 unchecked를 사용하면 예외가 발생하지 않고 순환하게 됩니다.

 

4. 블록과 식 형태

checked
{
    int first = int.MaxValue;
    int second = first + 1;
}

여러 연산에 적용하려면 코드 블록을 사용합니다.

int result = checked(value * multiplier);

int result = unchecked(value * multiplier);

특정 계산 하나에만 이런 식으로 적용할 수도 있습니다.

 

5. 상수 계산과 런타임 계산 차이

컴파일러가 미리 계산할 수 있는 상수 식은 범위를 넘으면 기본적으로 컴파일 오류가 날 수 있습니다.

int number = int.MaxValue + 1; // 컴파일 오류
int number = unchecked(int.MaxValue + 1);

명시적으로 unchecked를 사용하면 허용할 수 있습니다.

상수 식은 컴파일 단계에서 범위 초과를 발견할 수 있지만 런타임 계산은 checked 여부에 따라 예외가 발생하거나 값이 순환할 수 있습니다.

하지만!!!!

Unity에서는 기본적으로 오버플로우가 나도 Console창에 오류가 뜨지 않습니다. 왜냐하면 Unity는 기본적으로 unchecked이기 때문인데요. 이것을 바꾸고 싶다면 ProjectSettings이 아닌 Assets 폴더에 csc.rsp 파일을 만들어 C# 컴파일러 옵션을 전달해서 바꿀 수 있습니다. Unity는 csc.rsp를 통해 추가 명령줄 옵션을 컴파일러에 전달하는 방식을 지원해서 이기 때문입니다.

 

이러한 방식은 복잡하기 때문에 checked를 사용하면 간편하게 오류를 캐치할 수 있습니다.

 

6. 자료형 형변환에 영향

주로 정수형 계산과 정수 형변환에 영향을 줍니다.

 

대표적으로 byte, short, int, long, uint, ulong 이러한 자료형에서 사용할 수 있는데요.

int number = 300;

byte value = checked((byte)number);

 

예를 들어 큰 정수를 작은 정수형으로 변환할 때도 사용할 수 있습니다.

byte의 최댓값은 255이므로 OverflowException이 발생합니다.

 

byte value = unchecked((byte)number);

Debug.Log(value); // 44

요런식으로 작성한다면 300의 하위 비트만 남아 44가 됩니다.

float number = float.MaxValue;
number *= 2f;

Debug.Log(number); // Infinity

float와 double은 범위를 넘으면 보통 Infinity가 되기 때문에 checked가 같은 방식으로 예외를 발생시키지 않습니다.

신기하죠? ㅎㅎ 

 

 

오늘은  C#의 checked, unchecked에 대해서 알아보았는데여

이런 문법을 처음 보기도 하고 Unity 내부적으로나 자료형에 대해서 더 자세히 알게 된거 같아서 신기했습다.

게임 만들 때에도 실업에서는 사용하지 않을까...?라고 생각 들 정도로 유용했던 것 같습니다. ☺️

 

오늘의 노래 추천은 

Bon Jovi - It's My Life라는 노래입니다.

노래 가사가 후회 없는 삶, 자신의 방식대로 살아겠다는 용기, 꺾이지 않는 책임감을 뜻하여 

제가 살고 싶은 삶이랑 비슷하고 노래도 벅차오름이 있기 때문에 엄청 좋습니다!! ㅎㅎ 

포기하고 싶을 때 항상 이 노래를 부르며 의지를 불태웁니다.

It's My Life~

 

내일은 더욱 알차게 보내고 작성해 보도록 하겠습니다. 

봐주셔서 감사합니다. ☺️