[C#] Boxing, UnBoxing

Date:

카테고리:

태그:

개요

C#과 같은 .Net FrameWork 언어들은 모든 타입이 System.Object 로 부터 파생되어 설계되어 있다.

즉 간단한 예시로 보면 이런식으로 사용 가능하다.

int a = 5;
Object o = (Object)a; //boxing, (Object) 생략 가능

int b = (int)o; //unBoxing
  • Boxing

    int 는 Object상속관계이기 때문에 Object형으로 변환 가능하다. 이 과정을 Boxing 이라고 한다. Object형은 기본적으로 참조 형식인데, Boxing 한다는 의미는 값 형식의 int 형을 참조 형식으로 변환 한다는 의미다.

  • UnBoxing

    그와 반대 개념인 UnBoxingBoxing참조 형식을 다시 값 형식으로 변환하는 과정이다. UnBoxing은 int b = (int)o; 와 같이 명시적으로 타입을 지정해야 하며 UnBoxing은 기본적으로 Boxing 된 데이터에 대해서만 수행 가능하다. (오류 발생)

성능 문제

BoxingUnBoxing을 사용하여 값 형식의 다형성을 활용하거나 등으로 사용할 수 있지만 그 과정에서 성능 문제가 발생할 수 있다.

  • Boxing 할때

    • 값 형식참조 형식으로 변환할때 Stack에 있는 데이터를 Heap에 할당하므로 메모리 사용량이 증가한다.
  • UnBoxing 할때

    • 참조 형식값 형식으로 변환할때 Heap에 있던 데이터를 Stack으로 복사한다. 이는 추가적인 연산 비용을 발생시킨다.

    • 변환하려는 형식이 Boxing했던 값인지 확인하기 위해 런타임 중에 유형 검사가 필요하므로 추가적인 연산 비용을 발생시킨다.

BoxingUnBoxing을 자주 한다는 것은 메모리의 복사가 빈번하게 일어난다는 의미이다.

Generic

BoxingUnBoxing의 성능적인 문제 때문에 Generic을 사용하는 것이 권장되고 있다.

우리가 흔히 사용하는 제네릭 컬렉션중 하나인 List의 예시를 보자.

List<int> numbers = new List<int>(); //List<int>, 미리 타입 지정
numbers.Add(10); // boxing 없이 int 값을 저장

int firstNumber = numbers[0]; // unBoxing 없이 int 값을 읽음

기본적인 Boxing, UnBoxing 과 달리 Generic은 컴파일 시점 부터 어떤 타입인지 정보를 알고 있기 때문에 값 형식참조 형식간의 변화에 대한 과정이 필요하지 않다. 이는 곧 성능 향상에 이어지며 메모리 복사나 수명 관리와 같은 추가 연산 작업을 줄일 수 있다.

참고 자료



📚 혼자 공부하면서 기록한 공간입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😉

맨 위로 이동하기

C Sharp 카테고리 내 다른 글 보러가기

댓글 남기기