C#에서 데이터 타입은 크게 값 형식(Value Type), 참조 형식(Reference Type), 그리고 포인터 형식(Pointer Type)으로 나눌 수 있습니다. 각 형식은 메모리에 저장되는 방식과 동작 방식이 서로 다르기 때문에, C# 프로그래밍을 제대로 이해하려면 이들의 차이를 명확히 알아두는 것이 중요합니다.
값 형식(Value Types)
값 형식 변수에는 데이터가 직접 할당됩니다. 즉, 변수 자체에 실제 값이 저장되며, 모든 값 형식은 System.ValueType 클래스에서 파생됩니다. 값 형식은 일반적으로 스택(Stack) 메모리에 할당되어 성능 면에서 효율적입니다.
다음은 C#의 주요 값 형식 데이터 타입입니다.
| 타입 | 설명 | 범위 | 기본값 |
|---|---|---|---|
| bool | 부울(Boolean) 값 | true 또는 false | false |
| byte | 8비트 부호 없는 정수 | 0 ~ 255 | 0 |
| char | 16비트 유니코드 문자 | U+0000 ~ U+FFFF | '\0' |
| decimal | 28~29자리 유효 숫자를 가지는 128비트 고정밀 소수 | (-7.9 × 1028 ~ 7.9 × 1028) / 100 ~ 1028 | 0.0M |
| double | 64비트 배정밀도 부동 소수점 | (±)5.0 × 10-324 ~ (±)1.7 × 10308 | 0.0D |
| float | 32비트 단정밀도 부동 소수점 | -3.4 × 1038 ~ +3.4 × 1038 | 0.0F |
| int | 32비트 부호 있는 정수 | -2,147,483,648 ~ 2,147,483,647 | 0 |
| long | 64비트 부호 있는 정수 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0L |
| sbyte | 8비트 부호 있는 정수 | -128 ~ 127 | 0 |
| short | 16비트 부호 있는 정수 | -32,768 ~ 32,767 | 0 |
| uint | 32비트 부호 없는 정수 | 0 ~ 4,294,967,295 | 0 |
| ulong | 64비트 부호 없는 정수 | 0 ~ 18,446,744,073,709,551,615 | 0 |
| ushort | 16비트 부호 없는 정수 | 0 ~ 65,535 | 0 |
참조 형식(Reference Types)
참조 형식은 변수에 실제 데이터를 직접 저장하지 않습니다. 대신 데이터가 저장된 메모리 위치에 대한 참조(주소)를 담고 있습니다. 클래스, 인터페이스, 배열, 델리게이트 등이 대표적인 예이며, 일반적으로 힙(Heap) 메모리에 할당됩니다.
C#의 주요 참조 형식은 다음과 같습니다.
Object 형식
object 형식은 C# 공용 형식 시스템(CTS, Common Type System)에서 모든 데이터 타입의 최상위 기본 클래스입니다. 어떤 타입의 값이든 object 변수에 할당할 수 있으며, 필요할 때 명시적 캐스팅을 통해 원래 타입으로 되돌릴 수 있습니다.
Dynamic 형식
dynamic 형식 변수에는 어떤 타입의 값이든 저장할 수 있습니다. object와 비슷해 보이지만, dynamic 변수의 타입 검사는 컴파일 시점이 아닌 런타임에 수행된다는 점이 다릅니다.
String 형식
string 형식은 변수에 문자열 값을 할당할 수 있게 해주는 참조 형식입니다. string은 System.String 클래스의 별칭(alias)이며, 한 번 생성된 문자열은 변경할 수 없는 불변(immutable) 특성을 가진다는 점도 기억해 두면 좋습니다.