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