안녕하세요. 박민성입니다. ☺️
오늘은 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~
내일은 더욱 알차게 보내고 작성해 보도록 하겠습니다.
봐주셔서 감사합니다. ☺️