Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

맛있는 개발노트 (맛과 개발을 함께)

C# 세미나 자료: 정수 산술 넘침 점검 연산자 (checked / unchecked) 본문

C# 학습/C# 언어의 기초

C# 세미나 자료: 정수 산술 넘침 점검 연산자 (checked / unchecked)

DevGourmet 2025. 4. 7. 12:37

1. 개요

C#에서 정수 산술 연산은 메모리 크기에 따라 표현 가능한 수의 범위가 정해져 있습니다. 이 범위를 초과할 경우 **산술 오버플로우(Overflow)**가 발생할 수 있으며, 의도하지 않은 값이 저장되거나 예외가 발생할 수 있습니다.

이를 제어하기 위해 C#은 checkedunchecked 키워드를 제공하며, 이 연산자는 오버플로우 발생 시 행동을 제어할 수 있도록 합니다. 본 세미나에서는 이를 초급부터 고급까지 단계별로 설명합니다.


2. 기본 이론

2.1 산술 오버플로우란?

정수형 자료형은 고정된 크기의 비트를 사용하여 수를 표현합니다. 예를 들어 int는 -2,147,483,648 ~ 2,147,483,647의 값을 가질 수 있습니다. 이 범위를 초과하면 예상치 못한 값으로 순환(wrap around) 되어 저장됩니다.

int max = int.MaxValue;
int result = max + 1;
Console.WriteLine(result); // -2147483648

2.2 checked 연산자

checked는 산술 연산 중 오버플로우가 발생했을 때 **예외(OverflowException)**를 발생시켜 개발자가 이를 인지하고 처리할 수 있게 합니다.

checked
{
    int x = int.MaxValue;
    int y = x + 1; // OverflowException 발생
}

또는 한 줄에 적용:

int y = checked(x + 1);

2.3 unchecked 연산자

unchecked는 오버플로우가 발생하더라도 예외를 발생시키지 않고 기본적인 wrap-around 동작을 허용합니다.

unchecked
{
    int x = int.MaxValue;
    int y = x + 1; // 결과는 -2147483648
}

이는 성능이 중요한 경우 또는 오버플로우가 무시되어도 되는 경우 사용됩니다.


3. 단계별 설명

3.1 초급: 오버플로우 이해하기

int a = int.MaxValue;
int b = a + 1;
Console.WriteLine(b); // -2147483648

3.2 중급: checked / unchecked 블록 사용하기

checked
{
    int a = 1_000_000;
    int b = 3_000;
    int result = a * b; // OverflowException 발생 가능
}
unchecked
{
    int a = 1_000_000;
    int b = 3_000;
    int result = a * b; // wrap-around 결과
    Console.WriteLine(result);
}

3.3 고급: 메서드 단위, 컴파일러 옵션 활용

int SafeAdd(int x, int y)
{
    return checked(x + y);
}

int FastAdd(int x, int y)
{
    return unchecked(x + y);
}
  • 컴파일러 옵션 /checked+, /checked-로 전체 프로젝트 기본 동작 설정 가능
  • 예외를 try-catch로 핸들링 가능:
try
{
    checked
    {
        int val = int.MaxValue + 1;
    }
}
catch (OverflowException e)
{
    Console.WriteLine("오버플로우 발생: " + e.Message);
}

4. 주의사항 및 팁

  • 기본적으로 C#은 unchecked 모드입니다 (릴리즈 빌드 기준)
  • checkedint, long 등의 정수형 타입에만 적용됩니다
  • float, double, decimal과 같은 부동소수점 타입에는 적용되지 않음 (NaN 또는 Infinity 처리됨)
  • 디버깅 중에는 checked를 통해 오류를 조기에 포착하고, 성능이 중요한 릴리즈 빌드에서는 unchecked 활용을 고려합니다

5. 결론

  • 산술 오버플로우는 예기치 않은 버그로 이어질 수 있는 중요한 이슈입니다
  • checked 연산자를 사용하여 디버깅 시 예외를 발생시켜 문제를 조기에 확인할 수 있습니다
  • unchecked는 성능을 중시하거나 wrap-around 동작이 허용될 때 사용합니다
  • 프로젝트 상황에 따라 checkedunchecked를 적절히 조합하는 것이 중요합니다

6. Q&A

Q1. float나 double에도 checked를 사용할 수 있나요?
A1. 아니요. checked는 정수형 타입에만 적용됩니다. 실수형은 오버플로우 시 예외가 아닌 InfinityNaN을 반환합니다.

Q2. checked 사용 시 성능 저하가 큰가요?
A2. 약간의 연산 비용이 있지만, 안전한 코드 작성을 위해 디버깅 또는 테스트 환경에서는 사용하는 것이 좋습니다.

Q3. 전체 프로젝트에 checked를 적용하려면?
A3. Visual Studio에서는 프로젝트 설정 > Build 탭 > "Check for arithmetic overflow/underflow" 옵션을 체크하거나, 컴파일러 옵션 /checked+를 사용합니다.

Q4. unchecked 블록은 꼭 써야 하나요?
A4. 기본적으로 unchecked이므로 명시적으로 쓸 필요는 없지만, 명확한 의도 표현을 위해 사용하는 것이 좋습니다.