[C#] 03. 자료형


Study/C#  2020. 6. 23. 11:51

안녕하세요. 명월입니다.


이 글은 C#에서의 자료형에 대한 글입니다.


이전에 변수와 상수를 선언하는 방법에 대해 설명한 적이 있습니다.

링크 - [C#] 02. 프로그래밍 시작과 변수와 상수를 선언하는 방법


거기서 변수를 선언할 때, 간략하게 int의 정수형 타입을 사용한 적이 있습니다. 이 때, 변수를 선언할 때의 상황을 정확하게 설명하면 PC의 메모리에 공간을 할당하는 작업입니다.

공간을 할당한다고 했는데, 이게 어느 정도의 크기로 할당할 지에 대한 설정이 이 자료형입니다.

키워드 크기
문자 형식 데이터형
char 16비트 유니코드 문자(아스키코드 참조)
string char형식으로 이루어진 유니코드 문자열
부울 형식 데이터형
boolean 참(true), 거짓(false) 형태의 논리 데이터 처리
정수 형식 데이터형
sbyte -128 ~ 127
byte 0 ~ 256
short -32,768 ~ 32,767
ushort 0~65,535
int -2,147,483,648 ~ 2,147,483,647
uint 0 ~ 4,294,967,295
long -9,223,372,036,854,755,808 ~ 9,223,372,036,854,755,807
ulong 0 ~ 18,446,744,073,709,551,615
실수 형식 데이터형
float ±1.5*10-45~±3.4*1038
double ±5.0*10-324~±1.7*10308
decimal ±1.0*10-28~±7.9*1028
문자열 데이터형
string 문자열 데이터 타입 - char의 가변 배열
using System;
namespace Exception3
{
  class Program
  {
    // 실행 함수
    static void Main(string[] args)
    {
      // 콘솔 출력
      Console.WriteLine("{0}\t size : {1} byte", "bool", sizeof(bool));
      Console.WriteLine("{0}\t size : {1} byte", "char", sizeof(char));
      Console.WriteLine("{0}\t size : {1} byte", "sbyte", sizeof(sbyte));
      Console.WriteLine("{0}\t size : {1} byte", "byte", sizeof(byte));
      Console.WriteLine("{0}\t size : {1} byte", "short", sizeof(short));
      Console.WriteLine("{0}\t size : {1} byte", "ushort", sizeof(ushort));
      Console.WriteLine("{0}\t size : {1} byte", "int", sizeof(int));
      Console.WriteLine("{0}\t size : {1} byte", "uint", sizeof(uint));
      Console.WriteLine("{0}\t size : {1} byte", "long", sizeof(long));
      Console.WriteLine("{0}\t size : {1} byte", "ulong", sizeof(ulong));
      Console.WriteLine("{0}\t size : {1} byte", "float", sizeof(float));
      Console.WriteLine("{0}\t size : {1} byte", "double", sizeof(double));
      Console.WriteLine("{0}\t size : {1} byte", "decimal", sizeof(decimal));
      // 개행
      Console.WriteLine();
      // 아무 키나 누르면 종료한다.
      Console.WriteLine("Press any key...");
      Console.ReadLine();
    }
  }
}

위 각각의 데이터 타입의 소개와 사이즈에 대해서 설명했습니다. 실제 프로그램에서는 모든 타입을 다 사용하는 건 아니고 자주 사용하는건 string과 bool, byte타입, int와 float, decimal 정도가 아닐까 생각합니다.


위 소스를 보니 특이한게 char가 2byte인게 특이하네요.. C/C++에서 char의 사이즈는 -128~127으로 1byte의 값입니다. 그리고 unsigned, 즉 부호가 없는 unsigned char는 곧 byte 타입으로 byte가 1byte를 차지하게 됩니다.

그런데 C#에서는 char가 2byte로 되어 있습니다. 여기서 string이라는 문자열 클래스가 있는데 이것은 char의 배열 형식으로 구성되어 있습니다. 배열이란 간단하게 char가 한개가 아닌 여러개가 모여있는 집합이라는 뜻입니다.

즉, C#은 내부적으로 문자가 유니코드를 사용하기 때문에 기본 문자열 타입의 사이즈가 2byte로 설정되어 있지 않나 생각됩니다. 문자열 코드와 string 타입에 대해서는 다음에 자세히 설명하겠습니다.


여기서 다시 byte를 설명하면, PC는 모두 이진 데이터로 계산되고 있습니다. 이진 데이터란 0과 1로만 표현되어 있는 데이터인데 이를 PC에서는 bit라는 표현을 합니다.

1bit는 0과 1로 되어 있는 이진 데이터입니다. 여기서 다시 8bit가 되면 1byte가 되는데, PC안에서 사용되는 가장 최소 단위입니다.

즉, byte는 2의 8승으로 256까지 표현이 가능합니다.

int형은 총 4byte를 사용합니다. 즉 2의 32(8*4)승으로 그 크기는 4,294,967,296까지 표현이 가능하고 양수 2,147,483,647과 음수 -2,147,483,648까지 표현이 가능합니다. 양수가 1이 적은 이유는 0이 포함되어 있기 때문입니다.

즉, int형에 2,147,483,647를 초과되는 값을 넣으면 에러가 발생합니다.

그 이상의 데이터를 사용하려면 int보다 큰 long타입을 사용할 거라고 생각하는데, 실무에서는 decimal를 자주 사용합니다.

실수형은 보통 소수점 이하를 표현할 때 잘 사용하며 float타입을 자주 사용합니다. 그러나 프로그램에서는 부동 소수점 오차가 발생하게 되는데, 그래서 실무에서는 Decimal타입을 사용하는 경우한거나 소수점 이하를 정수로 변환 후에 계산하여 다시 실수로 변환하는 방법을 많이 사용합니다.

성능으로 따지면 Decimal타입을 사용하거나 정수 변환하여 다시 실수로 변환하는 것이 실수형 float타입으로 직접 계산하는 것보다 많이 느린데... 오차가 발생하는 것보다야..


소스 상에서 정수와 실수를 구분하기 위한 리터널이 존재하는데 float 타입은 f를 사용하고 double 타입은 d를 사용합니다.

using System;
namespace Exception3
{
  class Program
  {
    // 실행 함수
    static void Main(string[] args)
    {
      // 정수형은 그냥 숫자로 표현된다.
      int a = 1;
      // flaot 타입은 f를 붙힌다.
      float b = 1.1f;
      // double 타입은 d를 붙힌다.
      double c = 1.2d;
      // 콘솔 출력
      Console.WriteLine("a = " + a);
      Console.WriteLine("b = " + b);
      Console.WriteLine("c = " + c);
      // 개행
      Console.WriteLine();
      // 아무 키나 누르면 종료한다.
      Console.WriteLine("Press any key...");
      Console.ReadLine();
    }
  }
}

string은 특이하게 데이터 사이즈가 정해지지 않았습니다. 사실 string은 원시 데이터 타입(Primitive Type)이 아니고 char의 배열로 이루어진 클래스 타입입니다. 원시 데이터란 데이터 타입 자체로 메모리에 할당하는 타입을 말합니다. 즉, int는 4byte, long은 8byte 말입니다.

string은 char의 배열이기 때문에 원시 데이터가 아닙니다. 그러나 우리는 보통 char 문자 데이터를 사용하지 않고 문자열을 사용하기 때문에 char보다는 string을 많이 사용합니다. string을 완전하게 이해하려면 클래스와 배열, 문자 인코딩 타입등의 알아야 할 부분이 많이 있습니다. 다른 글에서 자세히 설명하겠습니다.


여기까지 C#에서의 자료형에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.