Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!시작하기

Microsoft. NET 을 시작하는 분들을 위한 강좌입니다. 주로 기초적인 내용과 때론 기본적인 내용을 다룹니다

checked / unchecked 키워드

작성자 : 박종명
최초 작성일 : 2009-07-01 (수요일)
최종 수정일 : 2009-07-01 (수요일)
조회 수 : 3220

하루 한 문법 두번째 시간입니다

* checked / unchecked

+(덧셈) , - (뺄셈) , *(곱셈), /(나눗셈) 과 같이 정수의 산술연산이나 형 변환시 오버플러(overflow) 체크
할지(checked) / 말지(unchecked) 를 체크 하는 C# 키워드 입니다

오버플러(overflow)란 '넘치다', '범람하다'라는 사전적 의미처럼 정해진 메모리 크기보다 더 큰 값을 저장할 경우 
예외가 발생하거나 데이터를 무시하고 정해진 크기로만 값을 변환해서 저장하는 현상을 말합니다

byte 변수를 생각해 보죠
byte 는 1byte(8bit) 저장공간을 가집니다. 그렇다면 8bit 에 저장할 수 있는 최대 값은 255 입니다
만일 byte 변수에 255를 초과하는 값을 저장하려 할 경우 overflow 가 발생하게 됩니다

이러한 overlfow 상황을 무시할지 아니면 감지할지(예외를 발생하게 할지) 설정하는 키워드가 바로
checked / unchecked 입니다

다음의 코드를 보죠

byte b = (byte) 255;
b = (byte) (b + 1);

결과가 어떻게 될까요? 프로그래머가 예상한대로 256일까요?
코드를 직접 작성해서 결과를 보세요. 어이없게도(?) 결과는 0 입니다
overlflow 가 발생했지만 예외는 발생하지 않고 값은 0으로 나왔습니다

대부분 이런 결과를 바라지는 않겠죠...

물론 위 코드야, 의도적으로 만든 코드라 쉽게 알 수 있지만 다양하게 얽혀 있는 실제 응용프로그램에서는
이러한 상황이 언제 발생할 지 모르는 경우가 많죠

결국 overflow 를 체크하지 않는다면 오류도 나지 않고 결과값은 이상해지고 응용프로그램은 엉뚱하게 동작할
수도 있게 되는 것이니 만큼 신경을 써야 합니다


사실 결과가 0으로 나온건 엉뚱한게 아니라 내부적으로 unchecked 환경에서 실행했기 때문에 당연한 겁니다
C# 컴파일러는 기본적으로 unchecked 옵션으로 컴파일을 수행합니다
Visual Studio 2005 의 프로젝트 속성에 보면 아래와 같이 unchecked가 기본값임을 알 수 있습니다 

결국 위 샘플코드인, 
byte b = (byte) 255;
b = (byte) (b + 1);

은 아래와 같은 코드로 보면 됩니다 (overflow 체크를 하지 않도록 코드블럭에 명시적으로 지정)

byte b = (byte)255;
unchecked
{
      b = (byte)(b + 1);
}

이 코드를 overflow 체크를 하도록 수정합니다

byte b = (byte)255;
checked
{
      b = (byte)(b + 1);
}

checked로 설정한 후 실행을 해 보면, 예외(OverlfowException)이 발생하게 됩니다
0이라는 의도하지 않은 값보다는 차라리 예외가 발생하는게 더 낫겠죠(모든 경우 그렇진 않더라도.. 대부분의경우)

오버플러(overlfow)로 인해 의도하지 않게 이상한(?) 데이터가 발생할 수 있기 때문에 checked 옵션은
신중하게 고려해 봐야 합니다

만일 특정 코드 블럭이 아닌 전역적으로 checked 옵션을 적용하고 싶다면 프로젝트 속성창에서
다음과 같이 체크를 해 주면 됩니다



이름
비밀번호
홈페이지
HS <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요