Ch1~Ch3 2주차까지의 내용—

데이터 형식

image.png

C#의 경우, 1) 기본데이터 형식과 복합 데이터 형식.

→ class 형이라고 생각하면 된다!

C#의 경우, 2*) 값 형식과 참조 형식*으로 나뉘어져 있다. (C++은 포인터가 추가)

데이터 형식 : 값 형식→LIFO

image.png

값형식의 경우에는 코드블록 {} 내에서 정의 된 변수들이 **스택(Stack)**에 할당되고, 이후에는 메모리 할당이 사라진다. (그림의 회색 박스 부분이 스택임)

int x;        // 이렇게 선언만 하면, 어떤값이 있을까?
						  // C,C++의 경우에는 0이 아닐수 있다!
              // 그러나, C#같은 경우에는 메모리가 정리되어, 0으로 바뀐다! (야호!)
              
int x = 100;   // 하지만, 이렇게 다른 값이라면? 넣어줘야한다.
int a = x +10; // 또한, 값이 0이지만 x에 내가 값을 정의안하면 에러가 생긴다 (시발!)
							 //추가적으로 x에 어떤 값을 안넣고 출력하면 컴파일 에러가 생긴

데이터 형식 : 참조형식→다이나믹memory

image.png

변수가 값 대신 값이 있는 곳의 위치(참조)를 담는 데이터 형식으로, 값은 **힙(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#에서 반드시 참조형으로 선언해야하는 자료형

  1. 배열

    {  int a[100];  }
    // 이런식의 구조는 C++에서는 맞는데 C#에서는 스택에 구조를 만든거라 오류
    // 또한 저 { } 벗어나면 배열 값 다 날아가므로 오류에 해당 -> 아래와 같이 정의
    {  int[] a = new int[100];  }
    // int[] 라는 뜻은 이건 참조변수고 이런식으로 정의한다.
    // 이후에는 기존과 같이 이용이 가능하다. 
    // 또한, 스택처럼 { } 일때 메모리가 사라지지는 않고 가비지 컬렉터가 지운다.
    // 근데 참조하는 int[] a는 이제 스택에 놓았으니까, 이건 {} 이후에 사라진다
    
  2. 클래스 객체

  3. 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

데이터 형식 : 2의 보수법

-x = 2^n - x 식으로 계산하는 방법이라고 한다. (잘 못알아듣겠지만)