티스토리 뷰

3. 데이터, 값 형식과 참조 형식, 그리고 스택과 힙



1. 데이터


 에니악 시절에 다루던 데이터는 수뿐이었다. 컴퓨터의 성능이 좋아지고 값이 싸지면서 다양한 곳에서 컴퓨터 활용되기 시작했고 그 용도도 다양해졌다. 


 C#은 다양한 종류의 데이터 형식(Data Type) 제공한다. 데이터 형식은 기본 데이터 형식(Primitive Type)과 복합 데이터 형식(Complex Data Type)으로 나눠진다. 복합 데이터 형식의 종류에는 구조체, 클래스, 배열, 등이 있다. 

 또, 값 형식(Value Types)과 참조 형식(Reference Types)으로도 분류가 가능한데 이 두 형식은 기본 데이터 형식과 복합 데이터 형식, 모두에게 존재한다. 



2. 값 형식과 참조 형식, 스택과 힙


 값 형식(Value Types)은 변수가 값을 담는 데이터가 형식이고, 참고 형식(Reference Types)은 변수사 값 대신 값이 있는 곳의 위치(참조)를 담는 데이터 형식이다. 


 우선 이해를 위해서는 C#으로 작성한 프로그램이 사용하는 두 가지 메모리 영역인 스택(Stack), 힙(Heap)을 알아야 한다. 값 형식과 관련 잇는 것은 스택 메모리 영역이고, 참조 형식과 관련 있는 것은 힙 메모리 영역이다. 


 스택은 차례대로 데이터가 메모리에 쌓였다가 코드 블록이 끝나면 걷혀 나가 자신이 담고 있던 데이터를 모두 수거해간다. 

 은 저장되어 있는 데이터를 스스로 제거하는 메커니즘을 갖고 있지 않고, 청소부를 따로 고용하고 있는데 CLR의 가비지 컬렉터가 바로 그것이다. 가비지 컬렉터는 프로그램 뒤에 숨어 동작하면서 힙에서 더 이상 사용하지 않는 객체가 있으면 그 객체를 쓰레기로 간주하고 수거하는 기능을 한다. 


 스택은 코드 블록이 끝나는 시점과 함께 데이터가 수거되는데 이는 스택의 장점이자 한계이다. 코드 블록이 끝나는 시점과 상관없이 데이터를 유지하고 싶을 때는 스택의 구조가 불편한 것이다. 

 그래서 프로그래머가 언제라도 데이터를 살릴 수 있도록 하는 또 다른 메모리 영역을 CLR이 제공한다. 프로그래머가 힙에 데이터를 올려 놓으면 코드 블록이 종료되어도 그 데이터는 계속 생명을 유지하고, 데이터가 더 이상 필요없을 때 가비지 컬렉터가 가져다 버려 메모리가 비로서야 사라지는 것이다. 


 참조 형식의 변수는 힙과 스택을 함께 이용하는데, 힙 영역에는 데이터를 저장하고 스택 영역에는 데이터가 저장되어 있는 힙 메모리의 주소를 저장한다. 참조 형식의 이름은 데이터를 직접 저장하는 대신 실제 데이터가 저장되어 있는 메모리의 주소를 참조해서 지어진 것이다. 


 정리하자면 스택은 변수의 생명 주기가 다 하면 자동으로 데이터가 제거되고, 힙은 더 이상 데이터를 참조하는 곳이 없을 때 가비지 컬렉터가 데이터를 치워주는 구조이다. 

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

[ 초보자를 위한 C# 200제 ] C#_003  (0) 2018.03.20
[ 초보자를 위한 C# 200제 ] C#_002  (0) 2018.03.19
[ 초보자를 위한 C# 200제 ] C#_001  (0) 2018.03.19
C#_2. 닷넷 프레임워크 & CLR  (0) 2018.03.13
C#_1. 기본 틀 이해하기  (0) 2018.03.13
댓글