
C#의 경우, 1) 기본데이터 형식과 복합 데이터 형식.
→ class 형이라고 생각하면 된다!
C#의 경우, 2*) 값 형식과 참조 형식*으로 나뉘어져 있다. (C++은 포인터가 추가)

값형식의 경우에는 코드블록 {} 내에서 정의 된 변수들이 **스택(Stack)**에 할당되고, 이후에는 메모리 할당이 사라진다. (그림의 회색 박스 부분이 스택임)
int x; // 이렇게 선언만 하면, 어떤값이 있을까?
// C,C++의 경우에는 0이 아닐수 있다!
// 그러나, C#같은 경우에는 메모리가 정리되어, 0으로 바뀐다! (야호!)
int x = 100; // 하지만, 이렇게 다른 값이라면? 넣어줘야한다.
int a = x +10; // 또한, 값이 0이지만 x에 내가 값을 정의안하면 에러가 생긴다 (시발!)
//추가적으로 x에 어떤 값을 안넣고 출력하면 컴파일 에러가 생긴

변수가 값 대신 값이 있는 곳의 위치(참조)를 담는 데이터 형식으로, 값은 **힙(Heap)**에 할당되고 메모리 주소만 **스택(Stack)**에 할당된다. 이후에는 가비지 컬렉터에 의해 해제된다.
스택은 코드블록 이후에는 사라짐 → 힙을 가르키는 주소가 더이상 존재하지 않음
→ 가비지컬렉터가 이를 확인하고, 힙 메모리를 정리한다.
i.e. ******포인터 변수와 같다, 하지만 이제 주소는 주지 않는 경우라고 생각하면 된다.
e.g 참조형의 경우, 값 a=10 했을때 a는 메모리 주소를 가르키는 놈이고 저장은 힙에 된다!
<aside> 💡
X32bit 같은거는 2^32bit까지의 주소를 할당이 가능 X64bit 같은거는 2^64bit까지의 주소를 할당이 가능 → 우리가 말하는 이런 X00bit 버전이라는건 하나의 명령으로 2^n bit연산이 가능하다는 뜻
→ 우리의 경우 64bit버전이므로 8bit=1byte 임에 따라 주소는 8byte이다!!!!
+램이 아무리커도 버전이 32bit버전이면 제한이 생긴다!
</aside>
<aside> 💡
Stack : 값변수를 저장하는 곳!! : 선언시 생성, 빠르다, 작다(수백KB)
Heap : 참조변수가 가르키는 곳!! : NEW에 의해 생성, 상대적 느림, 매우 크다
</aside>
<aside> 💡
C#에서 반드시 참조형으로 선언해야하는 자료형
배열
{ int a[100]; }
// 이런식의 구조는 C++에서는 맞는데 C#에서는 스택에 구조를 만든거라 오류
// 또한 저 { } 벗어나면 배열 값 다 날아가므로 오류에 해당 -> 아래와 같이 정의
{ int[] a = new int[100]; }
// int[] 라는 뜻은 이건 참조변수고 이런식으로 정의한다.
// 이후에는 기존과 같이 이용이 가능하다.
// 또한, 스택처럼 { } 일때 메모리가 사라지지는 않고 가비지 컬렉터가 지운다.
// 근데 참조하는 int[] a는 이제 스택에 놓았으니까, 이건 {} 이후에 사라진다
클래스 객체
String </aside>
| 데이터 형식 | 설명 | 크기(Byte) | C/C++ |
|---|---|---|---|
| byte | 부호 없는 정수 | 1 (8bit) | uisigned char |
| int | 정수 | 4 (32bit) | long(int_32t) |
| long | 정수 | 8 (64bit) | long long |
| char | 유니코드 문자 | 2 (16bit) | 존재하지 않음 |
| float | 유효 7 자리 | 4 (32bit) | float |
| double | 유효 15-16 자리 | 8 (64bit) | double |
| bool | 논리형식 | 1 (8bit) | bool |
-x = 2^n - x 식으로 계산하는 방법이라고 한다. (잘 못알아듣겠지만)