본문 바로가기

CS/C#

[ C# ] 값 형식, 참조 형식

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