1. 값 형식, 참조 형식
값 형식
= 데이터를 직접 저장하는 형식
= 스택 메모리에 실제 데이터 할당
참조 형식
= 참조할 데이터 위치를 저장하는 형식
= 힙 메모리에 실제 데이터 할당
= 스택 메모리에 힙 메모리 주소 할당
2. 메모리
메모리는 크게 4 가지 영역으로 나뉘어져 있다.
코드 영역
= 실행할 프로그램의 코드가 저장되는 영역
데이터 영역
= 전역 변수 및 정적 변수가 저장되는 영역
= 프로그램이 시작될 때 할당되고 종료할 때 해제
힙 영역
= 동적으로 할당된 메모리가 저장되는 영역
= 사용자 필요에 의해 메모리가 할당되고 가비지 컬렉터에 의해 해제
= 런타임에 메모리 크기 결정
스택 영역
= 지역 변수 및 매개 변수가 저장되는 영역
= 함수 또는 메서드가 호출될 때 할당되고 종료될 때 해제
= 컴파일 타임에 메모리 크기 결정
3. 얕은 복사, 깊은 복사
얕은 복사
= 객체의 참조만 복사하여 동일한 객체를 가리킴
= 동일한 메모리 공간 공유
= 값의 변경이 다른 쪽에 영향을 미침
int[] arr1 = { 1, 2, 3 };
int[] arr2 = arr1;
arr2[0] = 10;
Console.WriteLine(string.Join(", ", arr1)); // 10, 2, 3
Console.WriteLine(string.Join(", ", arr2)); // 10, 2, 3
깊은 복사
= 개별 객체를 생성하여 독립적인 데이터를 가짐
= 서로 다른 메모리 공간 사용
= 값을 변경해도 다른 쪽에 영향 없음
int[] arr1 = { 1, 2, 3 };
int[] arr3 = new int[arr1.Length];
Array.Copy(arr1, arr3, arr1.Length);
arr3[0] = 10;
Console.WriteLine(string.Join(", ", arr1)); // 1, 2, 3
Console.WriteLine(string.Join(", ", arr3)); // 10, 2, 3
4. 박싱, 언박싱
박싱
= 값 형식을 참조 형식으로 변환하는 과정
= 값 형식을 객체(Object)로 감싸서 힙 메모리에 저장
int i = 43;
object obj = i;
Console.WriteLine(obj); // 43
언박싱
= 참조 형식을 값 형식으로 변환하는 과정
= 힙 메모리에 저장된 객체의 값을 복사하여 스택 메모리에 저장
int i = 43;
object obj = i;
int j = (int)obj;
Console.WriteLine(j); // 43
메모리 관리
= 언박싱 과정에서 낭비되는 힙 메모리는 가비지 컬렉터가 관리
'CS > C#' 카테고리의 다른 글
[ C# ] 상속, 인터페이스, 추상 클래스 (1) | 2024.11.05 |
---|---|
[ C# ] Callback, Delegate, Event (0) | 2024.08.09 |
[ C# ] 객체지향 프로그래밍 (0) | 2024.07.26 |
[ C# ] 객체와 한정자 (0) | 2024.07.26 |