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은 참조 타입이기 때문에 박싱이 발생함

 

일단 박싱/언박싱은 확실히 힙까지 사용되지만 형변환은 스택 내에서만 일어나는 일이라는걸 알게됐다!!

 

회사 면접볼때 박싱과 언박싱에 대해서 질문이 나왔던 적이 있다. 사실..여태까지는 잘 생각 안하고 사용했다..기초지식이 확실히 중요한거같다 ㅠㅜ 열심히 공부하자..이제 질문나오면 확실히 대답할 수 있다!!!

 

반응형