본문 바로가기
Programming/C#

C# 박싱(Boxing)과 언박싱(Unboxing) 값 형식과 참조 형식의 변환

by Dev_카페인 2024. 6. 10.
반응형

[C#] 박싱(Boxing)과 언박싱(Unboxing): 값 형식과 참조 형식의 변환

안녕하세요! 이번 포스트에서는 C#의 중요한 개념인 박싱(Boxing)과 언박싱(Unboxing)에 대해 알아보겠습니다. 박싱과 언박싱은 값 형식(Value Type)과 참조 형식(Reference Type) 간의 변환을 설명하는 개념으로, 메모리 관리와 성능 최적화에 큰 영향을 미칩니다.

박싱(Boxing)이란?

박싱(Boxing)은 값 형식을 참조 형식으로 변환하는 과정입니다. 이 과정에서 값 형식의 값은 힙(Heap) 메모리에 저장되고, 그 참조가 스택(Stack) 메모리에 저장됩니다.

박싱의 동작 방식

int value = 123;     // 값 형식
object obj = value;  // 박싱

위 예제에서 value는 int 형식의 값 형식입니다. 이 값을 object 형식의 참조 형식으로 변환하기 위해 박싱이 발생합니다. 박싱 과정에서 value는 힙 메모리에 저장되고, 힙 메모리의 주소는 obj 변수에 저장됩니다.

언박싱(Unboxing)이란?

언박싱(Unboxing)은 참조 형식을 값 형식으로 변환하는 과정입니다. 이 과정에서 참조 형식의 값은 힙에서 값을 꺼내 스택에 저장됩니다.

언박싱의 동작 방식

object obj = 123;    // 박싱
int value = (int)obj; // 언박싱

위 예제에서 obj는 object 형식의 참조 형식입니다. 이 값을 int 형식의 값 형식으로 변환하기 위해 언박싱이 발생합니다. 언박싱 과정에서 힙 메모리에 저장된 값이 스택 메모리로 복사됩니다.

박싱과 언박싱의 예제

박싱 예제

int number = 42;     // 값 형식
object boxedNumber = number; // 박싱

Console.WriteLine(boxedNumber); // Output: 42

위 예제에서 number는 값 형식인 int입니다. 이 값을 참조 형식인 object로 변환하기 위해 박싱이 발생합니다.

언박싱 예제

object boxedNumber = 42; // 박싱
int number = (int)boxedNumber; // 언박싱

Console.WriteLine(number); // Output: 42

위 예제에서 boxedNumber는 참조 형식인 object입니다. 이 값을 값 형식인 int로 변환하기 위해 언박싱이 발생합니다.

박싱과 언박싱의 성능 고려사항

박싱과 언박싱은 추가적인 메모리 할당과 데이터 복사를 수반하기 때문에 성능에 영향을 미칠 수 있습니다. 따라서, 박싱과 언박싱을 자주 수행하는 코드에서는 성능 저하가 발생할 수 있습니다. 이를 최소화하기 위해 가능한 박싱과 언박싱을 피하는 것이 좋습니다.

예제: 성능 저하

int sum = 0;
for (int i = 0; i < 1000000; i++)
{
    object obj = i;     // 박싱
    sum += (int)obj;    // 언박싱
}

Console.WriteLine(sum);

위 예제는 박싱과 언박싱을 반복적으로 수행하므로 성능이 저하될 수 있습니다. 이를 피하기 위해 값 형식을 직접 사용하는 것이 좋습니다.

박싱과 언박싱의 장단점

장점

  1. 유연성: 값 형식을 참조 형식으로 변환하여 컬렉션 같은 데이터 구조에서 다양한 형식을 저장할 수 있습니다.
  2. 일관성: 참조 형식으로 변환하여 공통 인터페이스나 상속 구조를 사용할 수 있습니다.

단점

  1. 성능 저하: 박싱과 언박싱은 추가적인 메모리 할당과 데이터 복사를 수반하여 성능이 저하될 수 있습니다.
  2. 메모리 사용 증가: 힙 메모리에 값을 저장하므로 메모리 사용량이 증가할 수 있습니다.

박싱과 언박싱을 피하는 방법

박싱과 언박싱을 피하기 위해 다음과 같은 방법을 사용할 수 있습니다:

  1. 제네릭(Generic): 제네릭을 사용하면 값 형식을 참조 형식으로 변환하지 않고도 다양한 형식을 지원할 수 있습니다.
List<int> numbers = new List<int>();
numbers.Add(42);
int number = numbers[0];
  1. 값 형식 사용: 가능한 값 형식을 직접 사용하여 박싱과 언박싱을 피합니다.
int sum = 0;
for (int i = 0; i < 1000000; i++)
{
    sum += i;
}

Console.WriteLine(sum);

마치며

이번 포스트에서는 C#의 박싱(Boxing)과 언박싱(Unboxing)에 대해 알아보았습니다. 박싱과 언박싱은 값 형식과 참조 형식 간의 변환을 설명하는 중요한 개념입니다. 이러한 변환은 메모리 관리와 성능 최적화에 큰 영향을 미치므로, 박싱과 언박싱을 최소화하는 것이 좋습니다. LINQ와 같은 고급 기능을 사용할 때도 이러한 개념을 이해하면 더 효율적인 코드를 작성할 수 있습니다. 추가적인 질문이나 궁금한 점이 있다면 언제든지 댓글로 남겨주세요!

반응형