스마트한 개발 공부/C#

[C#] Data Type의 종류 및 특징과 형 변환

스마트한지노 2021. 8. 3. 16:44
728x90
반응형

데이터를 저장하는 이유는 필요한 순간에 읽고, 쓰고, 수정하기 위함이다. 
저장되는 데이터의 형식과 크기가 다르기 때문에 그에 따른 저장 방식의 기준을 정해서 사용한다.

1. C#의 Data Type 종류

  • 기본 데이터 타입 - MS에서 기본적으로 제공하는 데이터 타입(string, int 등)
  • 사용자 정의 데이터타입 - 기본 데이터 타입이 아닌 모든 데이터 타입
  • 상수, 열거형
  • 복합 데이터 형식 - 구조체(값 타입), 클래스(참조 타입) , 배열
  • 값 타입(Value Type)- 저장하려는 공간에 값이 들어감. (크기가 정해져 있다)
  • 참조 타입(Reference Type) - 저장하려는 공간에 참조값(주소)이 들어감. pointer와는 다르다. 실제 주소 값은 아니지만 C#에서는 pointer 가 없기 때문에 주소 값, 참조값이라도 혼용해서 사용한다.  

2. 값 타입과 참조 타입의 차이

  • 프로그램이 실행되면 그 순간 최소 1개 이상의 스레드가 실행이 되는데 스레드는 stack이라는 메모리 공간을 생성한다.
  • stack - 메모리 공간을 알아서 관리한다.
  • heap - 개발자가 필요할 때
  • 값 타입은 stack의 공간에 바로 저장되는 반면에 참조 타입은 heap에 실제 값이 저장되고 그 heap의 주소 값이 stack에 저장된다. 

string name = "스마트한 서울살이"
name = "스마트 팩토리"
Console.WriteLine(name);

int age = 25;
age = age + 1;
Console.WriteLine(age);
  • 값 타입의 경우에는 추가되는 공간이 없이 그 공간에서 값이 수정된다. 참조 타입은 heap에 새롭게 공간이 추가되고 데이터가 들어간다. 그리고 기존의 주소 값을 새로운 공간의 주소 값으로 변경해준다. 기존의 공간에 있던 데이터는 garbage collector에 의해서 제거된다.

3. 데이터 타입의 변환

(int)값
참조 string.Parse(value 값)  => 박싱(boxing)
참조 참조 (string)값
참조 int.Parse(참조값) => 언박싱(unboxing)
    • Boxing : 값 형식의 데이터를 Object에 담는다.
    • Unboxing: 힙의 값 형식의 데이터를 stack 객체에 할당

4. 기본 데이터 타입

4.1 정수 숫자 타입

양의 정수 - 제일 앞의 비트를 부호 비트(0-양수)
음의 정수 - 제일 앞의 비트를 부호 비트(0-양수)

데이터 형식 설명 크기(바이트) 범위
byte 양의 정수 1(8비트) 0 ~ 255
sbyte signed byte 1(8비트) -128 ~ 127
short 정수 2(16비트) -32,xxx ~ 32,xxx
ushort unsigned short 2(16비트) 0 ~ 65,xxx
int 정수 3(32비트) 0 ~ 42x,xxx,xxx
uint unsigned int 3(32비트) -21x,xxx,xxx ~ 21x,xxx,xxx 
long 정수 4(64비트)  
char 유니코드 문자 2(16비트)  

4.2 실수 데이터 형식

      • float, double, decimal(정말 큰 숫자일 때, 크기 16)

4.3 문자, 문자열 

      • 문자 : 한 글자 char(값, 기본) => 'A'
      • 문자열 : 문자 배열 string(참조, 기본) => "A"

4.4 논리 형식

      • bool 크기 1 참 거짓

4.5 object 형식

      • 모든 형식의 데이터를 다룰 수 있는 데이터 형식
      • 상속의 효과
      • 참조 형식
      • Object는 모든 데이터 타입의 최상위이다.

4.6 상수와 열거형

      • const 자료형 상수 = 값 => 선언한 이름은 상수가 된다(값을 바꿀 수 없다) 
      • const double pi = 3.14;​
      • enum 열거 형식명 : 기반자료형 {상수 1, 상수 2, 상수 3,...}; 위치는 class와 static 사이에 선언해준다. combo box처럼 정해진 목록 안에서 선택하도록 할 때 사용된다.
        class Program
            {
                enum channel { KBS, SBS, MBC, EBS, TvN }
                static void Main(string[] args)​
                {
                    channel b1 = channel.EBS;​

5. 형 변환

  • 암(묵)시적형 변환 : 컴파일러가 알아서 자동으로 형 변환해준다. => 별도의 코딩이 필요 없다.
    • 작은 정수 형식 변수 데이터 → 큰 정수 형식 변수
  • 명시적형 변환 : 컴파일러가 알아서 못하기 때문에 코딩으로 명시해줘야 한다.
    float f1 = (float)10.5;// double (8바이트) 에서 float(4바이트)로 바꾸는 건 데이터가 잘릴 위험이 있기 때문에 자동형변환 X
    float f2 = 10.5f;
    int k = (int)f1; // float(4바이트)에서 int(4바이트)는 크기는 같지만 형식이 다르기 때문에 자동형변환 X
    //자식이 부모로 형변환은 무조건 암시적형변환, 부모가 자식으로 형변환하는 것은 경우에 따라 다르다.
    object obj = 10;
    int a = (int)obj;​

    • 큰 정수 형식 변수 데이터 → 작은 정수 형식 변수 : 오버플로우, 언더플로우 발생 가능성
      k = 45000;
      short ss = (short)k; //명시적형변환을 하면, 컴파일할떄는 오류가 발생하지 않지만...실행할 때 오버플로우​

 

728x90
반응형