Unity 내일배움캠프 TIL 1101 | 박싱(Boxing)과 언박싱(Unboxing)

cheeseonrose·2023년 11월 1일
0

Unity 내일배움캠프

목록 보기
68/89
post-thumbnail

💡 박싱(Boxing)과 언박싱(Unboxing)

🍙 박싱(Boxing)

  • 값 타입 객체를 참조 타입으로 변환
  • 스택에 저장된 값 타입 객체를 힙으로 한 번 복사한 뒤, 힙에 복사된 영역을 참조 타입 객체가 가리키게 되는 일을 수행

🍣 언박싱(Unboxing)

  • 참조 타입 객체를 값 타입으로 변환
  • 힙에 있던 데이터를 다시 스택으로 복사하는 일을 수행

🍝 예시 코드

int i = 123;
object o = i;    // boxing

o = 123;  
i = (int)o;      // unboxing

🍛 사용 시 주의사항

  • 박싱과 언박싱은 수행하는 데 많은 계산 과정이 필요하여 오버헤드가 발생할 수 있다.
  • 어쩔 수 없이 박싱과 언박싱을 사용해야 하는 상황이라면 is 캐스팅을 통해 오류 없이 처리하는 과정이 필요하다.
  • 박싱 과정
    1. 힙 영역에 새로운 메모리 할당
    2. 스택의 값을 힙 메모리로 복사
    3. 힙 메모리의 주소 값을 갖는 새로운 스택 메모리를 할당
      시간적 오버헤드 발생
  • 언박싱
    • 가비지를 생성
      잠재적 오버헤드 발생

🍜 대체

  • 박싱과 언박싱 대신 제네릭을 사용하여 처리하는 것이 바람직하다.
    List<int> list = new List<int>();
     list.Add(1);

🍱 foreach와 박싱

  • 원래 foreach문 내부에서는 박싱이 일어나서 최적화 관점에서 좋지 않았다.
    • struct인 Enumerator가 여러 interface를 상속 받는데, interface의 메서드를 호출하는 과정에서 Enumerator가 struct인지 class인지 알 수 없어서 전부 참조 형식으로 간주했기 때문
  • 하지만 해당 이슈는 리팩토링을 통해 해결되었으며, 현재 for문과 foreach문의 성능적 차이는 거의 없다.

출처 - Microsoft Boxing 및 Unboxing(C# 프로그래밍 가이드)
출처 - [C# 문법] 박싱과 언박싱이란?

출처 - [C#] 박싱(Boxing)과 언박싱(Unboxing)이란?
출처 - C# 박싱과 언박싱이란? (개념 / 예제 / 사용 이유)



끗~~~

0개의 댓글