C#의 자료형과 'decimal'
자료형과 크기
먼저, C++을 공부하고 오신 분이라면 자료형의 크기가 운영체제별로 달라질 수 있는지 궁금해하실 수 있습니다.
C#에서는 기본 자료형 크기가 운영체제에 상관없이 일관되게 정해져 있습니다.
이는 C#이 .NET 기반에서 JIT 컴파일 혹은 런타임 환경에서 동작하며, 이로 인해 자료형 크기가 표준화되어 있기 때문입니다.
다만, 기본 자료형 중에서도 플랫폼에 따라 크기가 달라지는 특수 자료형인 nint와 nuint가 존재합니다.
이들은 각각 32비트 시스템에서는 4바이트, 64비트 시스템에서는 8바이트로 변동되며, 플랫폼 간 이식성을 고려할 때 사용하는 자료형입니다.
byte와 sbyte
매우 짧은 자료형을 나타내는
byte의 경우 기본 자료형이 부호가 없는 “0~255”까지를 나타내는 자료형입니다.
부호가 있는 자료라는 뜻(signed)으로 앞에 s를 붙인sbyte가 “-128 ~ 127”까지를 나타내는 자료형입니다.
| 자료형 | 크기 | 범위 | |
|---|---|---|---|
| 논리 | bool | 1 byte | false / true |
| 문자 | char | 2 byte | U+0000 ~ U+FFFF (모든 UTF-16 문자) |
| 정수형 | sbyte | 1 byte | -128 ~ 127 |
| byte | 1 byte | 0 ~ 255 | |
| short | 2 byte | -32,768 ~ 32,767 | |
| ushort | 2 byte | 0 ~ 65,535 | |
| int | 4 byte | -2,147,483,648 ~ 2,147,483,647 | |
| uint | 4 byte | 0 ~ 4,294,967,295 | |
| long | 8 byte | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
| ulong | 8 byte | 0 ~ 18,446,744,073,709,551,615 | |
| nint | 4 byte / 8 byte | (플랫폼에 따라 달라짐) | |
| nuint | 4 byte / 8 byte | (플랫폼에 따라 달라짐) | |
| 실수형 | float | 4 byte | $±1.5 × 10^{−45}$ ~ $±3.4×10^{38}$ (7자리 정밀도) |
| double | 8 byte | $±5.0×10^{−324}$ ~ $±1.7 × 10^{308}$ (15~16자리 정밀도) | |
| decimal | 16 byte | $±1.0 × 10^{−28}$ ~ $±7.9228×10^{28}$ (28~29자리 정밀도) |
float과 double, 그리고 decimal
실수를 표현하는 float, double, decimal은 자료형의 크기만 차이가 날 뿐 아니라, 정밀도와 표현할 수 있는 범위에도 차이가 존재합니다.
가장 큰 차이는 정밀도 입니다.
표에서 나타낸 바와 같이 float는 7자리, double은 15~16자리, decimal은 28~29자리의 정밀도를 제공합니다.
정밀도(precision)는 부동 소수점 숫자가 표현할 수 있는 유효 숫자의 개수 를 의미하며, 숫자가 얼마나 정확하게 저장되고 연산될 수 있는지를 나타냅니다.
따라서, decimal의 경우에는 금융 계산이나 통화 계산과 같이 매우 높은 정밀도가 요구되는 경우에 적합합니다.
decimal 자료형은 float와 double에 비해 더 높은 정밀도를 제공하지만, 표현할 수 있는 값의 범위는 상대적으로 좁습니다.
또한, float과 double은 하드웨어에서 직접 지원하는 IEEE 754 표준을 따르므로 부동 소수점 계산 속도가 상대적으로 빠릅니다.
즉, float과 double은 decimal보다 상대적으로 정밀도가 덜 필요하지만 빠르게 계산해야 하는 과학 시뮬레이션 등에서 사용하기 적합합니다.
정리
float,double- 정밀도: 각각 7자리, 15~16자리
- 범위:
decimal에 비해 매우 작은 숫자와 매우 큰 숫자를 모두 표현 - 성능:
decimal에 비해 빠름 - 메모리:
decimal에 비해 적은 메모리 필요 - 용도: 과학적 계산과 같이 상대적으로 적은 정밀도가 필요하면서도 빠른 계산 처리가 필요한 경우에 사용
decimal- 정밀도: 28~29자리의 매우 높은 정밀도
- 범위:
float나double에 비해 좁음 - 성능:
float나double에 비해 상대적으로 느림 - 메모리:
float나double에 비해 많은 메모리 필요 - 용도: 금융 프로그램과 같이 소수점 이하의 매우 높은 정밀도가 요구되는 경우에 사용
기본 자료형
C#에서 정수형 리터럴은 기본적으로 int, 실수형 리터럴은 double로 처리됩니다.
그 외에 특수한 접미사를 사용하는 경우는 다음과 같습니다.
| 자료형 | 접미사 |
|---|---|
| uint, nuint | U |
| long | L |
| ulong | UL |
| float | F |
| decimal | M |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// int
int intVar = 123456;
// uint
uint uintVar = 123456U;
// long
long longVar = 123456789012345L;
// ulong
ulong ulongVar = 123456789012345UL;
// float
float floatVar = 1.0f / 3.0F;
// double
double doubleVar = 1.0 / 3.0;
// decimal
decimal decimalVar = 1.0M / 3.0M;
참고
char (C# reference) - MicrosoftLearn