강의 목표

데이터 종류에 따라 명령을 내려야 한다! 하지만 CPU는 데이터 타입을 스스로 판단할 수 있는 능력이 없음
컴파일러가 작업을 도와줌

 [부동 소수점이란?]
 - 소수를 말함  
 - floating 이라는 것처럼 소숫점이 떠서 이동하는 것을 말함  
 
 [부동 소수점 <-> 고정 소수점]  
 고정 소수점에서는 소수점 이하를 몇개까지 표현할 것지 정하게 된다
 고정 소수점은 수를 두 부분으로 나눈다 => 소수점 이하 & 소수점 이상 3.14 => 3 / 14
 부동 소수점은 유효숫자를 두고 소수점의 위치를 따로 적는다 3.14 => 10의 -2 제곱 / 314
 
 정수와 부동소수점은 처리하는 알고리즘이 다르기 때문에 덧셈, 뻴셈, 곱셈알고리즘도 다르다
 그래서 CPU 내부에서 다른 장치를 타고 데이터가 가공이 된다 

| 데이터 형식(Data Types)

데이터의 유형크기를 지정
c#은 데이터 형식 크게 두가지로 나눔

| 변수(variable)

데이터를 저장하는 메모리공간 => 유형과 크기가 정해져 있어야한다.

정수(부호 있음) + 4byte 데이터 형식을 갖춘 변수를 만들겠다
정수(부호 있음) + 4byte 데이터 형식 => int 
데이터 형식을 변수 이름 앞에 붙여 사용
변수 이름 = 식별자
다른 코드로 부터 age 라는 변수를 식별할  있는 식별자

int age = 33;


c#의 메모리 : 스택과 힙

c# 은 크게 두 가지 형태의 메모리를 사용한다.
스택 과 힙

| 스택(stack) == 자동 메모리

밑에서 부터 쌓는 메모리 구조
데이터를 쌓아올리는 구조의 메모리가 바로 스택
나중에 쌓인데이터를 먼저 제거한다
쌓인 순서의 역순으로 필요없는 데이터를 자동으로 제거하게 된다
자동 메모리로 불리기도 한다

| 힙(Heap) == 자유 저장소

자유롭게 데이터를 저장할 수 있는 메모리
꺼낼때 특별한 순서가 없다
하지만 어디에있는지 위치를 파악해둬야함
자유 저장소라고 불리기도 한다


값 형식과 참조형식

| 값 형식 (Vaule Type)

메모리에 값을 직접 담는 데이터 형식
스택에 할당
코드가 종류가 되면 자동 메모리는 가장 마지막 부터 쌓인 데이터 부터 제거

{
    int a = 10; // | a |
    int b = 20; // | a | b |
    int c = 30; // | a | b | c |
}
// 코드가 끝나면 
// | a | b | c |
// | a | b |
// | a |
// 끝 이렇게 맨 위 부터 제거가 된다 

프로그래머가 스택에 뭔가를 할당하고 스택에서 뭔가를 제거하기 위해 코드를 작성한 것은 아무것도 없다
그냥 변수를 선언하고 값을 할당하면 자동으로 이루지게 된다

| 참조 형식(Reference Type)

메모리에 다른 변수의 주소를 담는 데이터 형식
데이터는 힙에 저장을 하고 스택에는 주소를 가리키게 함
더이상 해당 메모리를 참조하고 있는 변수가 없을때 가비지 콜렉터가 자동으로 수거를 해줌
이것을 루트라고 함

[이렇게 하는 이유?] 
복합 데이터 형식들은 데이터 형식이 조합된 것이기 떄문에 덩치가 크다
c나 c++는 프로그래머가 힙에 할당한 메모리를 직접 수거를 했어야했다
하지만 c#의 '가비지 컬랙터'가 자동으로 수거를 해줌
더이상 이 메모리를 참조하고 있는 변수가 없을때!

| 기본 데이터 형식(Primitive Tpye)

기본 데이터 형식이란 c#이 기본적으로 제공하는 데이터 형식을 말함

| Boxing, Unboxing

Boxing : 값 형식을 Object 형식에 옮겨 담아서 힙에 올리기 Unboxing : 힙에 올라가 있는 데이터를 Object에서 꺼내 값형식으로 옮기기

    object a = 20;

[boxing unboxing 이 필요한 이유]
값 형식은 스택이 저장되고 스택에 저장된 메모리는 자동 메모리이기 때문에 수명을 직접 결정할 수 없다
하지만 힙에 데이터를 올려놓으면 수명을 컨트롤 할 수 있다. 
사용하고 싶을떄 까지 계속 사용을 하고 더이상 사용하지 않으면 가비지 컬렉터가 수거를 해가기 때문

가비지 컬렉터가 수거해 가기 전까지 값 형식 데이터를 사용할 수 있으려면 힙에 올려야하는데 그 메커니즘이 박싱이라는 것

| 상수

변경이 가능한 수
항상 최초의 상태를 유지하는 수
const를 사용하여 선언
상수를 변경하려는 시도가 있으면 컴파일러가 에러를 일으킴

const int a = 32; // const + 데이터 형식 + 식별자 + 초기값

| 열거 형식(Enumerated Type)

기본적으로 상수
여러 상수를 하나의 이름아래 묶은 것
같은 종류의 상수를 선언할떄 enum을 많이 쓴다 enum으로 선언

사용자 응답을 상수로 정리를 할것

그냥할 경우
const int Result_YES = 0;
const int Result_NO = 1;
const int Result_CONFIRM = 2;
const int Result_CANCLE = 3;
const int Result_OK = 4;

이렇게하면 값을 할당할떄 잘못할수도 있고 문제가 생김


그래서 enum 쓰면 간단
enum DialogResult{
    YES, //0
    NO, //1
    CANCLE, //2
    CONFIRM, //3
    OK //4
}

DialogResult.YES; 이런식으로 쓰면됨

값이 자동으로 할당된다 그래서 중복을 피할  있다
프로그래머가 일일이 값을 할당할 필요도 없다

| var 키워드

형식 추론에 사용하는 키워드
컴파일러가 자동으로 형식을 추론해준다
var a = 3;이렇게 하면 자동으로 a 변수가 int 형식이라는 것을 판단을 함
var b = "HELLO" 이렇게 하면 컴파일러는 b가 string 형식이라고 추론함
지역 변수에 대해서만 사용가능 메소드 안에서만!! 클래스, 구조체 사용불가