참고 영상: https://www.youtube.com/watch?v=LKyDIjYMGwc&list=PLVsNizTWUw7GN8wPRhclbKuQa9aI9Cj2V&index=4
값형 예시
// 값형
int x = 10;
int y = x;
y = 20;
Console.WriteLine("x: " + x); // 10
Console.WriteLine("y: " + y); // 20
⚔ 참조 형식 예시
// 참조형 1 - 배열
int[] arr1 = new int[] { 1, 2, 3 };
int[] arr2 = arr1;
arr2[0] = 4;
Console.WriteLine("arr1[0]: " + arr1[0]); // 4
Console.WriteLine("arr2[0]: " + arr2[0]); // 4
// 참조형 2 - 클래스
class MyClass
{
public int Value;
}
MyClass obj1 = new MyClass();
obj1.Value = 10;
MyClass obj2 = obj1; // obj2는 obj1과 동일한 객체를 참조
obj2.Value = 20; // obj1과 동일한 객체를 참조하므로 값을 20으로 변경한다.
Console.WriteLine(obj1.Value); // 출력 결과: 20
박싱과 언박싱은 값형과 참조형 사이의 변환을 의미한다.
컴퓨터 시스템에서 프로그램이 실제로 사용하는 메모리 외에 추가로 소비되는 메모리를 말한다.
박싱을 하면 힙에 메모리를 할당하고, 힙에 스택의 값 복사가 일어나며 힙의 주소를 스택 메모리에 저장하면서 메모리 오버헤드가 발생한다.
object는 .NET Common Type System(CTS)의 일부이며, 모든 클래스의 직간접적인 최상위 클래스입니다.
모든 클래스는 object에서 상속되며, object는 모든 형식을 참조할 수 있는 포괄적인 타입입니다.
값을 스택에 저장하면 자동메모리이기 때문에 수명을 정할 수 없다.
박싱을 사용하면 값을 힙 영역에 저장해서 가비지 콜렉터가 수거하기까지로 수명을 정할 수 있다.
또한, 아래 예시처럼 object로 변환을 해서 다양한 타입의 변수들을 하나의 List에 담을 수 있는 범용성을 가진다.
⚔ 박싱 예시
static void Main(string[] args)
{
// 박싱과 언박싱
int num1 = 10;
object obj = num1; // 박싱
int num2 = (int)obj; // 언박싱
Console.WriteLine("num1: " + num1);
Console.WriteLine("num2: " + num2);
// List 활용 예제 -- 타입이 다른 변수를 하나의 리스트로 관리할 수 있다.
List<object> myList = new List<object>();
int intValue = 10;
myList.Add(intValue); // int를 object로 박싱하여 추가
float floatValue = 3.14f;
myList.Add(floatValue); // float을 object로 박싱하여 추가
// 언박싱: 참조 형식을 값형식으로 변환하여 사용
int value1 = (int)myList[0]; // object를 int로 언박싱
float value2 = (float)myList[1]; // object를 float로 언박싱
Console.WriteLine("value1: " + value1); // 10
Console.WriteLine("value2: " + value2); // 3.14f
}