CPU 에는 여러가지 장치가 장착되어있음 그중에서도 데이터를 가공하는 연산 장치가 있다. 현대의 프로세스에는 ALU와 FPU 함께 장착이 되어있다.
데이터 종류에 따라 명령을 내려야 한다!
하지만 CPU는 데이터 타입을 스스로 판단할 수 있는 능력이 없음
컴파일러가 작업을 도와줌
[부동 소수점이란?]
- 소수를 말함
- floating 이라는 것처럼 소숫점이 떠서 이동하는 것을 말함
[부동 소수점 <-> 고정 소수점]
고정 소수점에서는 소수점 이하를 몇개까지 표현할 것지 정하게 된다
고정 소수점은 수를 두 부분으로 나눈다 => 소수점 이하 & 소수점 이상 3.14 => 3 / 14
부동 소수점은 유효숫자를 두고 소수점의 위치를 따로 적는다 3.14 => 10의 -2 제곱 / 314
정수와 부동소수점은 처리하는 알고리즘이 다르기 때문에 덧셈, 뻴셈, 곱셈알고리즘도 다르다
그래서 CPU 내부에서 다른 장치를 타고 데이터가 가공이 된다
데이터의 유형과 크기를 지정
c#은 데이터 형식 크게 두가지로 나눔
- | unsigned |
---|---|
char | uchar |
sigend byte | byte |
short | ushort |
int | uint |
u-로 시작하는 것
=> unsigned 부호가 없다는 것을 의미
=> - 가 없다
=> 를 표기하지 않아도 usinged 에서는 무조건 양의 값만 저장이된다
|float |double| |—|—|
데이터를 저장하는 메모리공간 => 유형과 크기가 정해져 있어야한다.
정수(부호 있음) + 4byte 데이터 형식을 갖춘 변수를 만들겠다
정수(부호 있음) + 4byte 데이터 형식 => int 형
데이터 형식을 변수 이름 앞에 붙여 사용
변수 이름 = 식별자
다른 코드로 부터 age 라는 변수를 식별할 수 있는 식별자
int age = 33;
c# 은 크게 두 가지 형태의 메모리를 사용한다.
스택 과 힙
밑에서 부터 쌓는 메모리 구조
데이터를 쌓아올리는 구조의 메모리가 바로 스택
나중에 쌓인데이터를 먼저 제거한다
쌓인 순서의 역순으로 필요없는 데이터를 자동으로 제거하게 된다
자동 메모리로 불리기도 한다
자유롭게 데이터를 저장할 수 있는 메모리
꺼낼때 특별한 순서가 없다
하지만 어디에있는지 위치를 파악해둬야함
자유 저장소라고 불리기도 한다
메모리에 값을 직접 담는 데이터 형식
스택에 할당
코드가 종류가 되면 자동 메모리는 가장 마지막 부터 쌓인 데이터 부터 제거
{
int a = 10; // | a |
int b = 20; // | a | b |
int c = 30; // | a | b | c |
}
// 코드가 끝나면
// | a | b | c |
// | a | b |
// | a |
// 끝 이렇게 맨 위 부터 제거가 된다
프로그래머가 스택에 뭔가를 할당하고 스택에서 뭔가를 제거하기 위해 코드를 작성한 것은 아무것도 없다
그냥 변수를 선언하고 값을 할당하면 자동으로 이루지게 된다
메모리에 다른 변수의 주소를 담는 데이터 형식
데이터는 힙에 저장을 하고 스택에는 주소를 가리키게 함
더이상 해당 메모리를 참조하고 있는 변수가 없을때 가비지 콜렉터가 자동으로 수거를 해줌
이것을 루트라고 함
[이렇게 하는 이유?]
복합 데이터 형식들은 데이터 형식이 조합된 것이기 떄문에 덩치가 크다
c나 c++는 프로그래머가 힙에 할당한 메모리를 직접 수거를 했어야했다
하지만 c#의 '가비지 컬랙터'가 자동으로 수거를 해줌
더이상 이 메모리를 참조하고 있는 변수가 없을때!
기본 데이터 형식이란 c#이 기본적으로 제공하는 데이터 형식을 말함
정수 형식
|int
/ uint
|short
/ ushort
|byte
/ sbyte
|
|—|—|—|
|바이트|바이트|바이트|
float |
double |
decimal(디시멀) |
---|---|---|
4바이트 | 8바이트 | 16바이트 |
bool
string
Boxing : 값 형식을 Object 형식에 옮겨 담아서 힙에 올리기 Unboxing : 힙에 올라가 있는 데이터를 Object에서 꺼내 값형식으로 옮기기
object a = 20;
[boxing unboxing 이 필요한 이유]
값 형식은 스택이 저장되고 스택에 저장된 메모리는 자동 메모리이기 때문에 수명을 직접 결정할 수 없다
하지만 힙에 데이터를 올려놓으면 수명을 컨트롤 할 수 있다.
사용하고 싶을떄 까지 계속 사용을 하고 더이상 사용하지 않으면 가비지 컬렉터가 수거를 해가기 때문
가비지 컬렉터가 수거해 가기 전까지 값 형식 데이터를 사용할 수 있으려면 힙에 올려야하는데 그 메커니즘이 박싱이라는 것
변경이 가능한 수
항상 최초의 상태를 유지하는 수
const
를 사용하여 선언
상수를 변경하려는 시도가 있으면 컴파일러가 에러를 일으킴
const int a = 32; // const + 데이터 형식 + 식별자 + 초기값
기본적으로 상수
여러 상수를 하나의 이름아래 묶은 것
같은 종류의 상수를 선언할떄 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 a = 3;
이렇게 하면 자동으로 a 변수가 int 형식이라는 것을 판단을 함
var b = "HELLO"
이렇게 하면 컴파일러는 b가 string 형식이라고 추론함
지역 변수에 대해서만 사용가능 메소드 안에서만!! 클래스, 구조체 사용불가