Ch03 데이터 보관하기

2020. 1. 6. 17:53C# 언어/이것이 C# 이다. 책정리

반응형

ㅇ 데이터 형식

기본 데이터 형식

    - 값 형식

    - 참조 형식

 

복합 데이터 형식

    - 값 형식

    - 참조형식

 

ㅇ 값 형식 (스택관련)
  • 변수가 값을 담는 데이터 형식으로 값 형식의 변수는 모두 스택에 저장됨

 

ㅇ 참조 형식 (힙 관련)
  • 힙 영역에는 데이터를 저장하고 스택 영역에는 데이터가 저장되어 있는 힙 메모리의 주소를 저장

 

ㅇ 힙과 스택
  • 스택은 자신이 담고 있던 데이터가 쓰레기가 되지 않도록 모두 수거해감.
  • 힙은 데이터를 스스로 제거하는 메커니즘을 갖고 있지 않음 대신 CLR의 가비지 컬렉터가 있음
  • 가비지 컬렉터는 힙에 더 이상 사용하지 않는 객체가 있으면 그 객체를 수거해감

 

ㅇ 스택 영역과 힙 영역을 나눈 이유 ?

스택은 코드 블럭이 사라지는 시점에 함께 제거됨. 만약 코드 블럭이 끝나는 시점과 상관없이 데이터를 유지하고 싶을 때는 스택 구조가 사용되기 어려움. 그래서 프로그래머가 원한다면 데이터를 살릴 수 있는 다른 메모리 영역을 CLR이 제공하는 것

 

ㅇ 정수 계열 형식

 

데이터 형식 설명 크기(바이트) 담을 수 있는 값의 범위
byte 부호 없는 정수  1(8비트) 0~255
sbyte signed byte 정수 1(8비트) -128~127
short 정수 2(16비트) -32.768~32.767
ushor 부호 없는 정수 2(16비트) 0~65,535
int 정수 4(32비트) -2.147.483.648~2.147.483.647
uint 부호 없는 정수 4(32비트) 0~4,294,967,295
long 정수 8(64비트) ~~
ulong 부호 없는 정수 8(64비트) ~~
char 유니코드 문자  2(16비트)  

 

ㅇ 부동 소수점  형식

 

데이터 형식 설명 크기 범위
float 단일 정밀도 부동 소수점 형식      (7개의 자릿수만 다룸) 4(32비트) ~~
double 복수 정밀도 부동 소수점 형식      (15~16개의 자릿수 다룸) 8(64비트) ~~
decimal 29자리 데이터를 다룸 16(128비트)  

 

ㅇ 문자 형식과 문자열 형식

 

데이터 형식 설명 크기 표기
char 문자 데이터를 다룸   ' 작은 따옴표'
string 문자열 데이터를 다룸   " 큰 따옴표"

 

ㅇ 논리 형식

 

데이터 형식 설명 크기  범위
bool 논리 형식 1(8비트) true, false

 

ㅇ object 형식
  • object 형식은 어떤 데이터 이든지 다룰 수 있는 데이터 형식
  • C#은 object가 모든 데이터를 다룰 수 있도록 하기 위해 모든 데이터 형식이 자동으로 object형식으로 상속받게 함
  • 참조 형식이기 때문에 힙에 데이터를 할당
  • object 형식은 값 형식의 데이터를 힙에 할당하기 위한 "박싱" 기능을 제공
  • 박싱되어 있는 값을 꺼내 값 형식 변수에 저장하는 과정을 일컬어서 "언 박싱" 이라고함

 

ㅇ 데이터 형식 변환

변수를 다른 데이터 형식의 변수에 옮겨 담는 것을 "형식 변환"이라함

 

1. 크기가 서로 다른 정수 형식 사이의 변환

using System;
using static System.Console;

namespace p71
{
    class MainApp
    {
        static void Main(string[] args)
        {
            sbyte a = 127;
            WriteLine(a);

            int b = (int)a;
            WriteLine(b);

            int x = 128; // sbyte의 최대값 127보다 1 큰수
            WriteLine(x);

            sbyte y = (sbyte)x; // 오버 플로우 발생
            WriteLine(y);
        }
    }
}

 

 

작은 정수 형식 변수 -> 큰 정수 형식의 변수 (문제 없음)

큰 정수 형식 변수 -> 작은 정수 형식 변수( 오버플로우 발생)

"용량" 차이로 인한 문제

 

 

2. 크기가 서로 다른 부동 소수점 형식 사이의 변환

using System;
using static System.Console;

namespace p72
{
    class MainApp
    {
        static void Main(string[] args)
        {
            float a = 69.6868f;
            WriteLine("a : {0}", a); // a : 69.6868

            double b = (double)a;
            WriteLine("b : {0}", b); // b : 69.6868

            float x = 0.1f;
            WriteLine("x : {0}", x); // x : 0.1

            double y = (double)x;
            WriteLine("y : {0}", y); // y : 0.100000001490116
        }
    }
}

 

부동 소수점 형식의 특성상 오버플로우가 존재하지 않음 하지만 정밀성에 손상을 입음

 

 

3. 부호 있는 정수 형식과 부호 없는 정수 형식 사이의 변환

using System;
using static System.Console;


namespace p74
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int a = 500;
            WriteLine(a);

            uint b = (uint)a;
            WriteLine(b);

            int x = -30;
            WriteLine(x);


            uint y = (uint)x; // 언더 플로우 발생
            WriteLine(y);
        }
    }
}

 

 

4. 부동 소수점 형식과 정수 형식 사이의 변환

using System;
using static System.Console;

namespace p75
{
    class MainApp
    {
        static void Main(string[] args)
        {
            float a = 0.9f;
            int b = (int)a;
            WriteLine(b); // 0

            float x = 1.1f;
            int y = (int)x;
            WriteLine(y); // 1
        }
    }
}

 

5. 문자열과 숫자 사이의 변환

using System;
using static System.Console;

namespace p77
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int a = 123;
            string b = a.ToString();
            WriteLine(b); // 123

            float c = 3.14f;
            string d = c.ToString();
            WriteLine(d); // 3.14

            string e = "123456";
            int f = Convert.ToInt32(e);
            WriteLine(f); // 123456

            string g = "1.2345";
            float h = float.Parse(g);
            WriteLine(h); // 1.2345
        }
    }
}

 

숫자 -> 문자

int a = int.Parse("12345");

 

문자 -> 숫자

int c = 12345;

string d =  c.ToString();

 

ㅇ 상수와 열거 형식

 

상수와 열거 형식은 변수와 달리 안에 담긴 데이터를 절대 바꿀 수 없는 메모리 공간

프로그래머의 실수, 원치않은 데이터 변경을 막아 프로그램의 버그를 줄여줌

 

ㅇ 상수 (const )

 

const int a = 30;
변수의 선언과 동일 단, const 키워드 사용

 

ㅇ 열거 (enum)

메세지를 선택하는 YES, CANCEL의 값을 실수로 1이라는 값으로  지정하게 되면 YES를 선택했을 때

CANCEL이 작동하게 됨

이처럼 같은 범주에 속하는 여러 개의 상수를 선언할 때 아주 유용함

 

enum Message { YES, NO, CANCEL, OK}
  • 열거 형식은 enum 키워드 사용 
  • 자동으로 YES = 0, NO = 1, CANCEL = 2, OK = 3 할당됨.
  • 중복되어 값이 할당되는걸 방지해줌
  • 정수 계열만 사용할 수 있으며, 생략할 경우 컴파일러가 자동으로 int로 디폴트해줌
  • Mssage는 변수가 아닌 새로운 형식임 
  • Message a = Message.YES; 식의 활용이 가능함

 

enum Message { YES = 10, NO,CANCEL, OK= 50, CONFIRM}
  • 값을 직접 할당할 수 있음
  • YES =10 이고 NO는 10부터 순차적으로 할당됨
  • NO = 11, CANCEL = 12, OK = 50, CONFIRM = 51 

 

ㅇ Nullable 형식

0이 아닌 비어 있는 변수, Null 상태인 변수

 

int? a = null;
float? b = null;
double? c = null;
  • 데이터형식 뒤에 '?' 키워드 사용 
  • 값 형식에 한해서 사용가능
  • 참조 형식은 사용 불가

 

ㅇ Nullable 형식의 2가지 속성

 "HasValue"

해당 변수가 값을 갖고 있는지 또는 그렇지 않은지를 나타냄

int? a = null;
Console.WriteLine(a.HasValue) // a는 null 이므로 false 출력

 

"Value"

변수에 담겨 있는 값을 나타냄

int? a = null;
a = 3;
Console.WriteLine(a.Value);  // 3 출력

 

ㅇ Var 키워드

C#은 강력한 형식의 언어임 이는 프로그래머의 실수를 줄여 주는 장점이 있음

Var 키워드는 약한 형식 검사로 자동으로 형식을 지정해줌

 

var a = 3; // int형 지정
var b = "Hellow" // string형 지정
  • 지역 변수로만 사용가능
  • 선언과 동시에 초기화 해줘야함 ( 초기화 값이 없으면 컴파일러가 형식을 지정할 수 없음)

 

반응형