[This is C#] Chapter 3. 데이터 보관하기
Table of Contents
이것이 C#이다 책을 읽고 공부한 노트입니다.
데이터의 종류 #
- C#에서 데이터는 이렇게 나뉠 수도 있고
- 기본 데이터 형식(Primitive Type)
- 복합 데이터 형식(Complex Data Type)
- 이렇게 나뉠 수도 있다.
- 값 형식(Value Type)
- 참조 형식(Reference Type)
- 즉, 기본 데이터 형식이면서 값 형식일 수도 있고, 참조 형식일 수도 있는 것이다.
- 이 장에서는 기본 데이터 형식 데이터만 살펴 본다.
값 형식과 참조 형식 #
-
값 형식
- 스택에 저장된다.
- 중괄호를 만나면 메모리에서 제거된다.
-
참조 형식
- 힙에 데이터가 저장되고, 스택에 그 주소가 저장된다.
- 더이상 참조되지 않으면 가비지 컬렉터가 메모리를 수거해 간다.
기본 데이터 형식 #
- 기본 데이터 형식은 모두 15가지가 있는데 크게 다음과 같이 나뉜다.
- 숫자 형식 - 값 형식
- 논리 형식 - 값 형식
- 문자열 형식 - 참조 형식
object
형식 - 참조 형식
숫자 형식 #
- (1) 정수 계열
데이터 형식 | 크기(byte) | 값의 범위 |
---|---|---|
sbyte |
1 | -128 ~ 127 |
byte |
1 | 0 ~ 255 |
short |
2 | -32,768 ~ 32,767 |
ushort |
2 | 0 ~ 65,535 |
int |
4 | -2,147,483,648 ~ 2,147,483,647 |
uint |
4 | 0 ~ 4,294,967,295 |
long |
8 | -922,377,203,685,477,508 ~ 922,377,203,685,477,507 |
ulong |
8 | 0 ~ 18,446,744,073,709,551,615 |
char |
2 |
-
자릿수 구분자(
_
)를 사용하면 타이핑할 때 편리하다.int val = -1000_0000;
-
2진수, 10진수, 16진수 리터럴
- 리터럴(Literal)이란 문자 그대로의 고정값을 나타낸다.
- 2진수:
0b
를 앞에 붙인다. - 10진수: 아무것도 붙이지 않는다.
- 16진수:
0X
또는0x
를 앞에 붙인다.
-
음수를 표현하는 방식
- 부호와 절대값(Sign-and-magnitude)
- 단순히 맨 왼쪽 비트를 부호를 나타내는 데 사용한다.
- $+0$과 $-0$이 두 가지로 존재하는 문제가 있다. 그래서 2의 보수법을 사용한다.
- 2의 보수법(2’s Complement)
- 수 부분 비트를 채운다.
- 전체 비트를 반전시킨다.
- 반전된 비트에 $1$을 더한다.
- 따라서
sbyte
의11111111
의 값은 $-1$이 된다.
- 부호와 절대값(Sign-and-magnitude)
-
오버플로우(Overflow)
- 최대값보다 큰 데이터를 저장할 때 발생한다.
- 예를 들면,
byte
형식 변수에 $256$을 담으면, $0$이 담기게 된다.
-
언더플로우(Underflow)
- 최저값보다 작은 데이터를 저장할 때 발생한다.
- 예를 들면,
byte
형식 변수에 $-1$을 담으면, $255$가 담기게 된다.
- (2) 부동 소수 및 소수 계열
- 부동 소수점 형식(Floating Point Type)
- 소수점이 움직이면서 수를 표현한다는 뜻이다.
decimal
은 부동 소수점과는 다른 방식으로 소수를 다루며, 정밀도가 훨씬 높다.
- 부동 소수점 형식(Floating Point Type)
데이터 형식 | 설명 | 크기(byte) | 접미사 | 값의 범위 |
---|---|---|---|---|
float |
7개의 자릿수(단일 정밀도) | 4 | f | -3.402823e38 ~ -3.402823e38 |
double |
15~16개의 자릿수(복수 정밀도) | 8 | 없음 | -1.79769313486232e308 ~ -1.79769313486232e308 |
decimal |
29개의 자릿수 | 16 | m |
- 정밀도(Precision)
- 정보 손실 없이 나타낼 수 있는 유의한 자릿수.
- C#의
float
과double
은 IEEE754라는 표준 알고리즘에 기반한다.- 이에 따르면
float
형식은 다음과 같이 구성된다.- 1비트: 부호(Sign) 비트
- 8비트: 지수부(Exponent)
- 23비트: 가수부(Mantissa)
- 가수부가 23비트이기 때문에 이것으로는 총 7자리의 수를 만들 수 있으며, 즉 유효숫자가 7자리인 셈이다. 따라서 한정된 정밀도를 가진다.
- 이에 따르면
문자 형식과 문자열 형식 #
char
형식- 문자를 다루며 따옴표로 문자를 감싸줘야 한다.
string
형식- 문자열을 다루며 큰 따옴표로 문자열을 감싸줘야 한다.
논리 형식 #
bool
은True
혹은False
값을 가지며 크기는 $1$바이트이다.
object 형식 #
-
모든 데이터 형식의 조상이다.
-
박싱(Boxing)
- 값 형식의 데이터를 참조 형식 데이터로 변경할 때.
-
언박싱(Unboxing)
- 참조 형식의 데이터를 값 형식 데이터로 변경할 때.
object obj = 20; // 박싱
int val = (int)obj; // 언박싱
상수와 열거 형식 #
- 상수(Constants)와 열거 형식(Enumerator)은 변수와 다르게, 안에 담긴 데이터를 절대 바꿀 수 없는 메모리 공간이다.
const int a = 3;
- `enum Result { YES = 10, NO, CANCEL, CONFIRM, OK }
Nullable 형식 #
- 어떠한 값도 가지지 않는
null
이 될 수 있는 변수이다.- 데이터 형식 뒤에
?
를 붙여서 선언하면 된다. int? a = null;
- 데이터 형식 뒤에
var #
var
로 변수를 선언하면 컴파일러가 자동으로 해당 변수의 형식을 지정해준다.- 반드시 선언과 동시에 초기화를 해야한다.
- 지역 변수로만 사용할 수 있다. 클래스의 필드를 선언할 때는 사용할 수 없다.
var a = 3; // int형식
공용 형식 시스템 #
- 공용 형식 시스템(Common Type System)
- .NET의 형식 체계 표준이다.
- C#의 데이터 형식 체계는 모두 공용 형식 시스템을 따른다.
- 따라서 .NET 언어들끼리 호환성을 갖는다.
CTS 클래스 이름 | C# 형식 | C++ 형식 |
---|---|---|
System.Byte |
byte |
unsigned char |
System.SByte |
sbyte |
char |
System.Int16 |
short |
short |
System.Int32 |
int |
int 또는 long |
System.Int64 |
long |
__int64 |
System.UInt16 |
ushort |
unsigned short |
System.UInt32 |
uint |
unsigned int 또는 unsigned long |
System.UInt64 |
ulong |
unsigned__int64 |
System.Single |
float |
float |
System.Double |
double |
double |
System.Boolean |
bool |
bool |
System.Char |
char |
wchar_t |
System.Decimal |
decimal |
Decimal |
System.IntPtr |
없음 | 없음 |
System.UIntPtr |
없음 | 없음 |
System.Object |
object |
Object* |
System.String |
string |
String* |