2024. 3. 4. 16:55ㆍC#
값 형식
변수가 값을 담는 데이터 형식을 말한다.
stack 영역에 데이터를 저장하며 그 때문에 코드 블록을 닫는 중괄호 } 를 만나면 데이터가 소멸한다.
해당 데이터 형식
정수형 변수 : int, short, long
실수형 변수 : float, double
문자형 변수 : char
논리형 변수 : bool
구조체 : struct
stack 영역
이전에 설명한 것처럼 함수의 호출과 관련된 정보들을 저장하는 영역이다.
후입 선출(LIFO)의 방식으로 동작하며,
차례대로 stack에 쌓여있다가 코드 블록이 종료되면서 완전히 제거되는 특징을 가지고 있다.
(높은 주소에서 낮은 주소의 방향으로 저장된다.)
참조 형식
변수가 값 대신 값의 주소를 담고 있는 데이터 형식을 말한다.
heap 영역에 데이터를 저장하며 코드 블록이 종료되어도 데이터가 존재한다.
만약 프로그램이 종료되는 순간까지도 heap 영역에 데이터가 남아있으면 해당 데이터는 계속해서 메모리를 차지하는데,
이것이 장기적으로 이어지게 되면 메모리 누수(memory leak) 현상이 발생한다.
이를 방지해 주는 것을 가비지 컬렉터(Garbage Collector)라고 부르는데,
주로 heap영역을 중점으로 메모리 관리를 수행하는 프로그램이다.
해당 프로그램은 따로 선언하지 않아도 자동적으로 실행되어 heap 영역에 있는 데이터들 중
사용하지 않은 데이터를 판별하여 제거해준다.
해당 데이터 형식
클래스 : class
배열 : array
문자열 : string
인터페이스 : interface
델리게이트 : delegate
모든 데이터 형식의 조상 : object
heap 영역
이전에 설명한 것처럼 동적으로 할당되는 메모리들을 관리하는 영역이다.
선입 선출(FIFO)의 방식으로 동작하며,
더이상 데이터를 참조하는 곳이 없을 때 가비지 컬렉터(Garbage Collector)가 데이터를 치워주는 특징을 하지고 있다.
가비지 컬렉터가 데이터를 수거하지 않으면 해당 데이터는 계속 heap 영역에 남아있다.
(낮은 주소에서 높은 주소의 방향으로 저장된다.)
Boxing과 Unboxing
모든 데이터 형식의 조상인 object 형식은 기본적으로 참조 형식이다.
그러나 object는 모든 데이터 형식을 받아들일 수 있어 값 형식의 데이터를 입력받는 경우도 있다.
이럴경우 메모리는 이를 어떻게 취급할까?
정답은 값 형식의 데이터를 참조 형식으로 변환시키는 것이다.
object 형식이 제공하는 해당 기능을 우리는 박싱(Boxing)이라고 부른다.
그럼 역으로 참조 형식의 데이터를 값 형식으로 바꾸는 것을 무엇이라고 할까?
간단하게 생각하면 된다.
박싱(Boxing)이 값 형식 데이터를 참조 형식 이라는 박스에 싸는 작업이라고 생각하면
그 반대로 박스의 물건(데이터)을 풀어보는 것이다.
그것이 바로 언박싱(UnBoxing)이다.
즉, 간단하게 정리하면
object 형식은 값 형식 데이터를 받아들일 경우, 박싱(Boxing)을 수행하여 heap 영역에 데이터를 저장하고
해당 데이터를 찾기 위해서 heap 영역에 저장된 주소를 stack 영역에 저장한다.
그리고 해당 데이터를 다시 값 형식으로 변화시킬 경우, stack 영역에 저장된 주소 값을 이용하여 heap 영역에 저장된 데이터에 접근한 뒤, 언박싱(Unboxing)을 수행하여 데이터를 변환시킨다.
'C#' 카테고리의 다른 글
반복기 Iterator (0) | 2024.03.13 |
---|---|
[ C# ] Event (정의와 delegate와의 차이점) (0) | 2024.03.11 |
[ C# ] Delegate (0) | 2024.03.11 |
[ C# ] Getter와 Setter 그리고 Property (0) | 2024.03.05 |
[ C# ] Class 의 상속 (0) | 2024.03.05 |