출처 :exclamation:

  • 본 내용은 C# 공부 내용이며 책과 강의를 정리한 내용입니다

강의 목표

  • 데이터 형식의 종류
  • 변수의 개념
  • 값형식과 참조형식 : 데이터 형식은 크게 두 가지 종류가 있다
  • 기본 데이터 형식
  • 상수와 열거 형식 : 상수 <->변수
  • var 키워드 *********



| CPU 의 연산장치

CPU 에는 여러가지 장치가 장착되어있음 그중에서도 데이터를 가공하는 연산 장치가 있다. 현대의 프로세스에는 ALU와 FPU 함께 장착이 되어있다.

  • ALU(Arithmetic Logic Unit) 정수만 처리하는 장치
  • FPU(Floating Point Unit) 부동소수점 수만 처리

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

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

| 데이터 형식(Data Types)

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

  • 기본 데이터 형식
    • 정수 형식
    - unsigned
    char uchar
    sigend byte byte
    short ushort
    int uint
      u-로 시작하는 것 
      => unsigned 부호가 없다는 것을 의미 
      => - 가 없다 
      => 를 표기하지 않아도 usinged 에서는 무조건 양의 값만 저장이된다 
    
    • 부동소수형식

    |float |double| |—|—|

  • 복합 데이터 형식
    기본 데이터 형식을 바탕으로 조합을 하여 하나의 데이터 형식을 새로 만드는것

| 변수(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#이 기본적으로 제공하는 데이터 형식을 말함

  • 수형식
    • 정수 형식 |int/ uint |short/ ushort|byte/ sbyte| |—|—|—| |바이트|바이트|바이트|

    • 부동 소수점 형식
      크기가 클수록 정밀도와 표현 범위가 늘어나지만 메모리 사용량이 커지기 때문에 적당한 크기를 선정해야함
      float double decimal(디시멀)
      4바이트 8바이트 16바이트
  • 논리 형식 bool
  • 문자열 형식 string
  • object 형식
    모든 데이터 형식의 조상
    boxing unboxing
  • 복합 데이터 형식은 기본데이터 형식을 바탕으로 만들어짐 |클래스 |구조체|튜플| |—|—|—|


| Boxing, Unboxing :star:

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 형식이라고 추론함
지역 변수에 대해서만 사용가능 메소드 안에서만!! 클래스, 구조체 사용불가

태그:

카테고리:

업데이트:

댓글남기기