C#
C# - 박싱/언박싱과 박싱/언박싱&형변환 차이
Dev_Jen
2025. 7. 1. 10:45
반응형
✅ 박싱(Boxing) & 언박싱(Unboxing)
🔸 박싱(Boxing)
- 값 형식(Value Type) 데이터를 **참조 형식(Reference Type)**으로 변환하는 것
- 값 타입(예: int, float)을 object 타입에 저장하면 박싱이 발생
- 이 과정에서 값이 힙에 복사되고, 새로운 참조 객체로 할당됨
int num = 10; object obj = num; // 박싱
🔸 언박싱(Unboxing)
- 박싱된 object를 다시 원래의 값 타입으로 꺼내오는 것
- 힙에 있는 데이터를 스택에 복사하는 작업
- 반드시 명시적 형변환이 필요하며, 잘못된 형변환 시 런타임 오류 발생
int original = (int)obj; // 언박싱
🔸 단점
- 박싱/언박싱은 메모리 할당과 복사 비용이 발생 → 성능 저하
- 특히 루프, 게임 로직에서 자주 발생하면 GC 부담으로 이어짐
그리고 궁금한게 생겼다 그럼 형변환과 무엇이 차이날까? 싶어서 GPT한테 물어보았다.
✅ 형변환(casting) vs 박싱/언박싱의 차이
🔹 형변환(casting)
- 같은 형식 계열 내에서 타입만 바꾸는 것
- 메모리 위치나 구조는 그대로
float f = 3.14f; int i = (int)f; // 형변환 (float → int)
✅ 스택 내에서 값 자체가 바뀌는 것이지, 힙에 복사되는 게 아님
✅ 꼭 object로 해야 박싱/언박싱이 일어날까?
🔥 박싱은 object뿐만 아니라 인터페이스로도 발생해!
예시:
interface IPrintable
{
void Print();
}
struct MyStruct : IPrintable
{
public void Print() { Console.WriteLine("Hello"); }
}
IPrintable p = new MyStruct(); // ✅ 박싱 발생
- MyStruct는 값 타입이지만, IPrintable은 참조 타입이기 때문에 박싱이 발생함
일단 박싱/언박싱은 확실히 힙까지 사용되지만 형변환은 스택 내에서만 일어나는 일이라는걸 알게됐다!!
회사 면접볼때 박싱과 언박싱에 대해서 질문이 나왔던 적이 있다. 사실..여태까지는 잘 생각 안하고 사용했다..기초지식이 확실히 중요한거같다 ㅠㅜ 열심히 공부하자..이제 질문나오면 확실히 대답할 수 있다!!!
반응형