C# 데이터 타입 완전 정복: 값 타입, 참조 타입, 포인터 타입
C# 변수 범주
C# 변수는 세 범주로 나뉩니다.
- 값 타입 (Value Types)
- 참조 타입 (Reference Types)
- 포인터 타입 (Pointer Types)
값 타입 (Value Type)
System.ValueType 파생. 변수에 데이터 직접 저장. 예: int, char, float. 선언 시 메모리 할당되어 값 보관.
C# 2010 값 타입 표
| 타입 | 표현 | 범위 | 기본값 |
| bool | 불리언 | True/False | False |
| byte | 8비트 부호없는 정수 | 0~255 | 0 |
| char | 16비트 유니코드 문자 | U+0000~U+FFFF | '\0' |
| decimal | 128비트 고정소수점 (28-29 유효숫자) | (±7.9×10²⁸)/10⁰~²⁸ | 0.0M |
| double | 64비트 배정도 부동소수점 | (±)5.0×10⁻³²⁴ ~ (±)1.7×10³⁰⁸ | 0.0D |
| float | 32비트 단정도 부동소수점 | -3.4×10³⁸ ~ +3.4×10³⁸ | 0.0F |
| int | 32비트 부호있는 정수 | -2,147,483,648 ~ 2,147,483,647 | 0 |
| long | 64비트 부호있는 정수 | -9.22×10¹⁸ ~ 9.22×10¹⁸ | 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 |
크기 확인: sizeof 연산자
using System;
namespace DataTypeApplication {
class Program {
static void Main(string[] args) {
Console.WriteLine("Size of int: {0}", sizeof(int));
Console.ReadLine();
}
}
}
결과: Size of int: 4 (바이트)
참조 타입 (Reference Type)
실제 데이터가 아닌 데이터가 있는 메모리 참조(주소)를 저장. 여러 변수가 같은 메모리 위치를 참조 가능. 한 변수로 데이터 변경 시 다른 변수도 반영.
내장 참조 타입: object, dynamic, string.
Object 타입
CTS(공통 타입 시스템) 최상위 기본 클래스. System.Object 별칭. 모든 타입 값 할당 가능 (박싱/언박싱 필요).
object obj;
obj = 100; // 박싱 (값 타입 → object)
Dynamic 타입
어떤 타입 값이든 저장. 타입 검사는 런타임에 수행.
dynamic <변수명> = 값;
예: dynamic d = 20;
object는 컴파일 타임 타입 검사, dynamic은 런타임 검사 차이가 핵심.
String 타입
문자열 값 할당. System.String 별칭. object 파생. 리터럴 두 형태:
- 따옴표:
"Tutorials Point"
- @따옴표(verbatim):
@"Tutorials Point" (이스케이프 무시, 여러 줄 가능)
사용자 정의 참조 타입: class, interface, delegate (후속 장에서 다룸).
포인터 타입 (Pointer Type)
다른 타입의 메모리 주소 저장. C/C++ 포인터와 유사. unsafe 컨텍스트에서만 사용 가능.
type* identifier;
예: char* cptr; int* iptr;
자세한 내용은 'Unsafe Codes' 장에서 다룹니다.