본문 바로가기
ETC/C#

C# 데이터 보관하기

by 빡구동동 2021. 1. 8.

C# 데이터 보관하기


데이터에도 종류가 있다

데이터 형식
기본 데이터 형식 복합 데이터 형식
(구조체, 클래스, 배열)

→ 이미지, 소리 등의 데이터를 표현할 때 사용

 

데이터 형식

기본 데이터 형식에도 '값 형식'과 '참조 형식'이 있고

복합 데이터 형식도 '값 형식'과 '참조 형식'이 있다.


변수

변수를 선언하다 '컴파일러'에게

오이오이... "이 변수에 필요한 메모리 공간을 예약해줘" 

 

int x; // int = 데이터 형식, x = 식별자(변수 이름)

컴파일러가 int 형식을 위해 메모리 공간을 할당하고 이 공간을 number라는 식별자가 사용할 수 있도록 준비하는 모습


값 형식과 참조 형식

값 형식 변수가 값을 담는 데이터 형식
스택(Stack) 메모리 영역
데이터를 스택에 넣음
참조 형식 변수가 값 대신 값이 있는 곳의 위치(참조)를 담는 데이터 형식
힙(Heap) 메모리 영역
데이터를 힙에 넣음

 


스택과 값 형식

{
	int a = 100;
	int b = 200;
	int c = 300;
}

                      스택과 값 형식 

 

코드 블록을 여는 괄호 "{"가 실행되는 시점에서는 스택에 아무것도 없었다.

그런데 int a = 100;이 실행되면서 변수 a가 스택에(맨 아래 1) 쌓인다.

그다음 줄 b를 선언하면서 스택에는 a 위에 b가 쌓였고, 그 다음은 c

값 형식의 변수는 모두 이 스택에 저장된다.

 

즉, 코드 블록 안에서 생성된 모든 값 형식의 변수들은

프로그램 실행이 중괄호 "}"를 만나면 메모리에서 제거된다. 

 

마치 스택은 청소부가 필요 없을 정도로 시민 의식이 투철한 메모리 구조


힙과 스택과 참조 형식

반면에 힙은 저장되어 있는 데이터를 스스로 제거하는 메커니즘을 갖고 있지 않다.

대신 청소부를 고용하고 있는데, CLR의 가비지 컬렉터(Garbage Collector)이다.

 

이 힙 영역의 사용 이유는 스택의 경우에 코드 블록이 끝나는 시점과 상관없이 데이터를 유지하고 싶을 때는 스택의 구조가 발목을 잡는 요소가 되지만, 힙에 데이터를 올려 놓으면 코드 블록이 종료되는 지점과는 상관없이 그 데이터는 계속 생명을 유지한다. 

그리고 이 데이터는 프로그래머가 더 이상 사용하지 않는 쓰레기가 됐을 때 가비지 콜렉터가 가져가 버린다.

 

참조 형식의 변수는 힙과 스택을 함께 이용하는데, 힙 영역에는 데이터를 저장하고 스택 영역에는 데이터가 저장되어 있는 힙 메모리의 주소를 저장한다.

{
	object a = 10;
	object b = 20;
}

CLR이 위 코드를 실행하면 그림과 같이 실제 값 10과 20은 힙에 저장하고, a와 b는 저장된 힙의 주소만 스택에 저장한다.

아까 스택에 저장된 데이터는 코드 블록이 끝나는 지점에서 모두 걷혀나간다고 했다. 

이 예제에서도 "}"를 만나는 곳에서 a와 b는 스택에서 사라진다.

힙에는 여전히 10과 20이 남아 있지만, 이 데이터들은 CLR의 메모리 청소부인 가비지 콜렉터가 수거한다.

 


부호 있는 정수와 부호 없는 정수

똑같은 1바이트만을 사용하는데도 부호 있는 정수 sbyte는 -128~127을 담을 수 있고 부호 없는 정수 byte는 0~255까지를 담는 이유는 뭘까?

 

byte는 8개의 비트를 모두 수를 표현하는데 사용하고 sbyte는 1개의 비트는 부호를 표현하기 위해 사용하고 나머지 7개의 비트만 수를 표현하는 데 사용하기 때문

'ETC > C#' 카테고리의 다른 글

데이터를 가공하는 연산자  (0) 2021.01.11
C# 문자열 다루기  (0) 2021.01.10
C# 데이터 보관하기 (3)  (0) 2021.01.10
C# 데이터 보관하기 (2)  (0) 2021.01.09
C# 프로그램 뜯어보기  (0) 2021.01.07

댓글