Programming/C#

C# 박싱과 언박싱이란? (개념 / 예제 / 사용 이유)

JeongKyun 2022. 1. 16.
반응형

서론

이번 글에서는 평소 프로그래밍을 할 때 몰라도 개발은 가능하지만 프로그램에서 사용되는 메모리가 많거나 메모리 관리가 필요하다면 필히 알아야 하는 박싱과 언박싱에 대한 내용을 정리해 볼 것이다.

추가적으로 변수를 사용함에 있어서 알아야하는 값 타입과 참조 타입에 대해서도 정리해볼려한다.


값 타입과 참조 타입이란?


1. 값 타입 (Value Type)

  • 값 타입은 스택영역에 저장한다.
  • 값 타입은 Object를 상속받은 System.ValueType을 상속받은 구조체이다.
  • ex) int => System.Int32로 정의 되며, 상속 관계는 Object ->ValueType -> Int32 순
  • 데이터에 직접 값이 저장된다.



2. 참조 타입(Reference Type)

  • 힙에 저장된다.
  • 모든 타입의 Base Class는 System.Object를 상속받는다.
  • 데이터에 직접 값이 저장되지않고 해당 데이터의 참조 값이가 저장된다.
  • 처음 변수를 선언하면 값 타입과 달리 메모리가 생성되지 않는다.

 


 

박싱과 언박싱이란?

 

1. 박싱(Boxing)이란?

박싱(Boxing) 구조

1-1) 정의

  • 값 형식을 Object의 형태인 참조 형식으로 변환 하는것을 박싱이라고 말한다.

 

 

1-2) 특징

  • 스택에 있는 데이터가 힙으로 복사되는 작업을 이룬다.
  • 보통 암시적으로 변환이 되며, 명시적 변환도 가능하다.
  • 리소스를 많이 잡아먹는다.

 

 

1-3) 예제 소스

int i =123; // 값 타입 (value type)

object obj = i; // 박싱(Boxing) =>  힙 영역에 123을 저장.

 

 

2. 언박싱(UnBoxing)이란?

언박싱(UnBoxing) 구조

1-1) 정의

  • Object형식에서 값 형식으로 변환하는것을 언박싱이라 말한다.

 

 

1-2) 특징

  • 힙에 있던 데이터를 스택으로 복사를 하는 과정이다.
  • 언박싱을 할 때 기존과 다른 타입으로 언박싱하거나, 해당 타입보다 작은 범위로 변환을 하면 에러(InvalidCastException)가 호출된다. 그래서 선언할 때 is 연산자를 통해서 미리 같은 타입인지 캐스팅을 해보는 것이 필요하다.
  • 리소스를 많이 잡아먹는다.

 

 

 

1-3) 예제 소스

int i =123; // 값 타입 (value type)

object o = i; // boxing (123 값을 힙 영역에 저장)

int j = (int)o; //unboxing

 


 

결론

힙에 새로운 개체 할당이 일어나는 박싱과 언박싱의 특성 때문에 리소스를 많이 잡아 먹어서 보통 잘 사용을 하지않는다.

박싱과 언박싱을 하는 과정은 굉장히 많은 시간이 소요되므로, 제네릭을 사용하여 처리하는 것이 바람직하다고 한다. 만약 어쩔수 없이 박싱과 언박싱을 사용해야하는 상황이라면 is 캐스팅을 통하여 오류 없이 처리하는 과정이 필요하다.

만약 개발하는 프로그램에서 많은 대용량 메모리들을 관리해야하는 상황이라면 해당 부분들을 꼭 참고하여 사용해야할 것 같다.

댓글

💲 많이 본 글