object란??
object 형식은 모든 형식을 다룰 수 있는 데이터 형식입니다.
object가 모든 형식을 다룰 수 있는 이유는 상속 덕분입니다.
C#은 object가 모든 데이터 형식을 다룰 수 있도록 모든 데이터 형식이 object 형식으로 부터 상속받게 했습니다.
즉 object 형식은 모든 데이터 형식의 부모가 된 것입니다.
object a = 2025;
object b = 3.14159265358979323846m;
object c = false;
object d = "반갑습니다";
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);

어떻게 object가 모든 데이터를 담을 수 있을까요?
박싱과 언박싱에 대해 알면 이해할 수 있습니다.
박싱이란?
object는 참조 형식입니다.
참조 형식이기 때문에 힙 메모리에 할당합니다.
하지만 int, float 같은 형식은 값 형식이기에 스택 메모리에 할당합니다.
그렇다면 값 형식의 데이터를 object 형식에 담았다면, 스택 메모리에 할당 될까요? 힙 메모리에 할당 될까요?
object 형식은 값 형식을 힙 메모리에 할당할 수 있도록 박싱 기능을 제공합니다.
간단히 얘기 하자면, 박싱은 값 형식을 참조 형식으로 변환하는 행동입니다.
object a = 2025;

먼저 코드에서 object a를 선언했습니다.
그럼 위 사진처럼 2025는 힙에 할당되고, a는 그 주소를 참조하는 방식입니다.
언박싱이란?
그럼 반대로 참조 형식을 값 형식으로 변환하는 행동이 있을까요?
그것이 바로 언박싱입니다.
언박싱은 박싱된 값 형식을 원래의 값 형식으로 꺼내는 과정입니다.
즉, 변환 대상이 처음부터 값 형식이었던 것이어야 합니다.
만약 참조 형식이 원래부터 참조 형식이었다면(예: string, class 객체), 그건 언박싱이 아니라 단순 캐스팅입니다.
object a = 2025;
int b = (int)a;
아까 선언한 a를 다시 가져왔습니다.
a는 2025가 박싱되어 저장된 힙을 참조하고 있는 중입니다.
그리고 int b는 a가 참조하고 있는 메모리로 부터 값을 복사하려고 하는 중입니다.




그림처럼 b를 선언하면 Stack 메모리에 할당된 뒤, b가 Heap에 있는 값에 참조합니다.
그 다음 Heap에 있는 값을 복사해 갑니다. 그리고 b에 저장이 되어 최종적으로 b는 2025가 됩니다.
요약
박싱 : [값 형식] → 힙에 복사 → 참조형(object) 변수에 저장
언박싱 : [object 참조] → 힙에서 값 꺼내서 스택(값 형식 변수)에 복사
'C# > 문법' 카테고리의 다른 글
| C# 스레드 임의로 종료하기 / 스레드의 상태들 (2) | 2025.08.25 |
|---|---|
| C# 프로세스와 스레드 (2) | 2025.08.21 |
| C# 문법 17 -- 데이터 형식 정리 9 (0) | 2024.12.07 |
| C# 문법 16 -- 데이터 형식 정리 8 (0) | 2024.12.06 |
| C# 문법 15 -- 데이터 형식 정리 7 (0) | 2024.12.05 |