Skip to main content

[This is C#] Chapter 3. 데이터 보관하기

이것이 C#이다 책을 읽고 공부한 노트입니다.




데이터의 종류 #

  • C#에서 데이터는 이렇게 나뉠 수도 있고
    1. 기본 데이터 형식(Primitive Type)
    2. 복합 데이터 형식(Complex Data Type)
  • 이렇게 나뉠 수도 있다.
    1. 값 형식(Value Type)
    2. 참조 형식(Reference Type)
  • 즉, 기본 데이터 형식이면서 값 형식일 수도 있고, 참조 형식일 수도 있는 것이다.

  • 이 장에서는 기본 데이터 형식 데이터만 살펴 본다.



값 형식과 참조 형식 #

  • 값 형식

    • 스택에 저장된다.
    • 중괄호를 만나면 메모리에서 제거된다.
  • 참조 형식

    • 힙에 데이터가 저장되고, 스택에 그 주소가 저장된다.
    • 더이상 참조되지 않으면 가비지 컬렉터가 메모리를 수거해 간다.



기본 데이터 형식 #

  • 기본 데이터 형식은 모두 15가지가 있는데 크게 다음과 같이 나뉜다.
    1. 숫자 형식 - 값 형식
    2. 논리 형식 - 값 형식
    3. 문자열 형식 - 참조 형식
    4. 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. 수 부분 비트를 채운다.
      2. 전체 비트를 반전시킨다.
      3. 반전된 비트에 $1$을 더한다.
      • 따라서 sbyte11111111의 값은 $-1$이 된다.
  • 오버플로우(Overflow)

    • 최대값보다 큰 데이터를 저장할 때 발생한다.
    • 예를 들면, byte 형식 변수에 $256$을 담으면, $0$이 담기게 된다.
  • 언더플로우(Underflow)

    • 최저값보다 작은 데이터를 저장할 때 발생한다.
    • 예를 들면, byte 형식 변수에 $-1$을 담으면, $255$가 담기게 된다.

  • (2) 부동 소수 및 소수 계열
    • 부동 소수점 형식(Floating Point Type)
      • 소수점이 움직이면서 수를 표현한다는 뜻이다.
    • decimal은 부동 소수점과는 다른 방식으로 소수를 다루며, 정밀도가 훨씬 높다.

데이터 형식 설명 크기(byte) 접미사 값의 범위
float 7개의 자릿수(단일 정밀도) 4 f -3.402823e38 ~ -3.402823e38
double 15~16개의 자릿수(복수 정밀도) 8 없음 -1.79769313486232e308 ~ -1.79769313486232e308
decimal 29개의 자릿수 16 m

  • 정밀도(Precision)
    • 정보 손실 없이 나타낼 수 있는 유의한 자릿수.
  • C#의 floatdouble은 IEEE754라는 표준 알고리즘에 기반한다.
    • 이에 따르면 float형식은 다음과 같이 구성된다.
      • 1비트: 부호(Sign) 비트
      • 8비트: 지수부(Exponent)
      • 23비트: 가수부(Mantissa)
    • 가수부가 23비트이기 때문에 이것으로는 총 7자리의 수를 만들 수 있으며, 즉 유효숫자가 7자리인 셈이다. 따라서 한정된 정밀도를 가진다.

문자 형식과 문자열 형식 #

  • char 형식
    • 문자를 다루며 따옴표로 문자를 감싸줘야 한다.
  • string 형식
    • 문자열을 다루며 큰 따옴표로 문자열을 감싸줘야 한다.

논리 형식 #

  • boolTrue혹은 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*