Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# checked와 unchecked 키워드 완벽 가이드: 산술 오버플로우 처리 방법

C#에서는 checked 또는 unchecked 컨텍스트 안에서 코드를 실행할 수 있습니다. 두 컨텍스트의 핵심 차이는 산술 오버플로우(arithmetic overflow)를 어떻게 처리하느냐에 있습니다.

checked 컨텍스트에서는 산술 연산 중 오버플로우가 발생하면 예외(OverflowException)가 던져지지만, unchecked 컨텍스트에서는 오버플로우가 조용히 무시되고 잘린(truncated) 결과값이 반환됩니다.

Checked 예외란?

checked 키워드를 사용하면 정수형(int, long 등) 산술 연산과 형 변환에 대한 오버플로우 검사를 명시적으로 활성화할 수 있습니다. 검사를 적용하고 싶은 식 앞에 simply checked 키워드만 붙이면 됩니다.

res = checked(val + 10);

예를 들어 변수 val의 값이 2147483647, 즉 int 타입의 최대값(int.MaxValue)이라고 가정해 보겠습니다. 여기에 10을 더하면 int 범위를 초과하게 되는데, 위 코드는 checked 컨텍스트로 감싸져 있으므로 런타임에 오버플로우 검사가 수행되고 System.OverflowException이 발생합니다.

참고로 오버플로우 검사는 다음 세 가지 방법으로 활성화할 수 있습니다.

  • /checked+ 컴파일러 옵션 지정
  • 프로젝트 빌드 설정(환경 구성)에서 오버플로우 검사 활성화
  • 코드 내에서 checked 키워드 직접 사용

Unchecked 예외란?

unchecked 키워드는 정수형 산술 연산과 형 변환에 대한 오버플로우 검사를 명시적으로 비활성화합니다. 사용 방법은 checked와 동일하게 식 앞에 키워드를 붙여주면 됩니다.

res = unchecked(val + 10);

마찬가지로 val의 값이 2147483647일 때 위 코드를 실행하면 어떻게 될까요? unchecked 키워드로 인해 오버플로우 검사가 수행되지 않으므로 예외는 발생하지 않습니다. 대신 오버플로우된 비트가 무시되어 의도치 않은 값(이 경우 -2147483639)이 결과로 저장됩니다.

정리: 언제 어떤 키워드를 사용해야 할까?

C#에서 기본 컨텍스트는 unchecked입니다. 따라서 별도 설정이 없다면 일반적인 산술 연산에서는 오버플로우가 자동으로 무시됩니다. 금융 계산처럼 정확성이 중요한 코드에는 checked를 사용해 오버플로우를 조기에 감지하고, 성능이 중요하고 오버플로우가 허용되는 해싱 연산 같은 경우에는 unchecked를 활용하는 것이 좋습니다.