[C#]3. 데이터를 담는 변수와 상수
출처
- 본 내용은 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
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 형식이라고 추론함
지역 변수에 대해서만 사용가능 메소드 안에서만!! 클래스, 구조체 사용불가
댓글남기기