본문 바로가기

DEV_STUDY/C#

[C# 객체지향] Boxing & Unboxing 박싱/언박싱


오늘은 박싱과 언박싱에 대해서 알아보자.

박싱이란?

값타입을 참조타입으로 변환하는 것이다. 이게 무슨말이냐? 값 타입을 참조 타입으로 변환한다니....

그전에 박싱/언박싱에 대해서 설명하기 위해서 구조체와 클래스의 정의에 대한 내용이 다시 등장하는데 우선 복습하고 가보자.

클래스와 구조체의 다른점?!

클래스는 참조타입이고, 구조체는 값타입이란 점!

여기서 한가지 더 집고 넘어 가야 할 부분은 메모리. 앞에서 기본적으로 공부하고 넘어가야 할 부분.

메모리가 할당되고 안되고의 차이를 집고 넘어가야 할것이다.
값타입은 변수의 이름을 선언함과 동시에 메모리가 할당되는것이며, 참조타입은 변수의 이름을 선언하고 그것을 생성해줘야 메모리가 할당되는 것이다.

using System;
class BoxingTest1
{
public static void Main()
{
int p = 123;
       object o = p; //Boxing이 일어나는 곳
       Console.WriteLine(o);
}
}


여기서 보면, int p 는 값타입이다. 그리고 object o=p 가 되는순간  boxing 이 일어나는데, 간단하게 말해서 힙영역에서 o에 박스를 만들어서 그안에 p의 값을 복사 해온다~ 이런뜻이다.
object o 는 p의 값이 바뀌면 따라서 바뀌게 되는것이다.
이것이 boxing이다.

반대로 unboxing 이란, 참조타입을 값타입으로 바꿔주는것이다.

using System;
class BoxingTest1
{
public static void Main()
{
int p = 123;
       object o = p; //Boxing이 일어나는 곳
       int t= (int)o; 
       Console.WriteLine(o);
}
}


보면 int t에다가 o를 집어넣는데 여기서 주의할점은 캐스팅을 해주어야 한다는 것이다.
이렇게 되면 참조하는 것이 아니라, t라는 새로운 변수가 메모리에 할당된다.