<개인공부>/[C#]

[C#] checked, unchecked 키워드에 대해서.

BlockDMask 2019. 3. 20. 00:19
반응형

안녕하세요. BlockDMask 입니다.

C언어, C++과는달리 C#에는 정말 신기한것들이 많네요.

오늘은 overflow, underflow를 체크해주는 checked, unchecked 키워드에 대해서 살펴보겠습니다.


1. C# checked, unchecked 란?


▼ checked?

chekced 키워드는 상수값 들의 연산이나 변환에 의한 오버플로, 언더플로 검사를 컴파일러 단에서 걸러주도록 하는 키워드 입니다.


▼ unchecked?

unchecked 키워드는 상수값 들의 연산이나 변환에 의해 오버플로, 언더플로가 생긴다 하더라도 컴파일러에게 "내가 의도한거니까 무시해라" 하는 키워드 입니다.


▼ 여기서 오버플로 언더플로에 대해서 알아보고 넘어가겠습니다.

*overflow(오버플로)?

데이터 타입이 표현할수 있는 최대값을 넘어버려서 최소값이 되는 경우를 말합니다.


*underflow(언더플로)?

데이터 타입이 표현할 수 있는 최소값을 넘어버려서 최대값이 되는 경우를 말합니다.


ex) C#에서는 byte 타입이 있습니다. 이 byte는 부호없는 8비트 정수를 표현하는 자료형입니다.

2에 8제곱이기 때문에 0~255범위의 총 256개의 수를 표현할 수 있는 데이터 타입입니다.


값이 255의 byte 타입 변수에서 +1을 하면 256이 되어야하는데 byte 타입의 표현할 수 있는 수는 255가 한계지요. 그래서 결과값이 우리의 의도와는 다르게 0이 되어버립니다. 이런경우를 데이터 타입의 최대 표현범위를 넘었다. 오버(over)했다 해서, 오버플로우(오버플로, overflow)라고 합니다.


반대로, 값이 0 인 byte 타입 변수에서 -1을 하게 되면 0을 넘어서 -1을 의도했겠지만, byte타입이 표현할 수 있는 최소값은 0이기 때문에 -1을 하게 되면 255가 나오게 됩니다. 이런 경우를 데이터 타입의 최소 표현범위를 넘었다. 언더(under)했다 하여서, 언더플로우(언더플로, underflow)라고 합니다.


2. C# checked 예제1 (overflow)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace exCSharp
{
    class _20190320_checked_unchecked
    {
        static void Main(string[] args)
        {
            byte a = 255;
            checked
            {
                a++;    //over flow
            }
            Console.WriteLine("overflow : " + a.ToString());
        }
    }
}
cs


▲ checked 예제1 결과.

위에 나오는 것 처럼 컴파일단에서 overflow를 감지하는걸 볼 수 있습니다.


3. C# checked 예제2 (underflow)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace exCSharp
{
    class _20190320_checked_unchecked2
    {
        static void Main(string[] args)
        {
            byte b = 0;
            checked
            {
                b--;    //under flow
            }
            Console.WriteLine("underflow : " + b.ToString());
        }
    }
}
 
cs


▲ checked 예제2 결과.

위에 나오는 것 처럼 컴파일단에서 underflow를 감지하는걸 볼 수 있습니다.

(vs에서는 underflow, overflow 둘다 overflow라고 표현을 합니다.)


4. C# unchecked 예제(overflow, underflow)


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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace exCSharp
{
    class _20190320_checked_unchecked3
    {
        static void Main(string[] args)
        {
            byte a = 255;
            byte b = 0;
 
            unchecked
            {
                a++//overflow
                b--//underflow
            }
            Console.WriteLine("unchecked example. BlockDMask.");
            Console.WriteLine("overflow  [255++] : " + a.ToString());
            Console.WriteLine("underflow [0--  ] : " + b.ToString());
        }
    }
}
 
cs


▲ unchecked 예제 결과.

위에 나오는 것 처럼 명확하게 overflow, underflow가 일어난다 해도, 컴파일단에서는 무시하고 무사히 프로그램이 실행 되는걸 볼 수 있습니다.

반응형