💡 박싱(Boxing)과 언박싱(Unboxing)
🍙 박싱(Boxing)
- 값 타입 객체를 참조 타입으로 변환
- 스택에 저장된 값 타입 객체를 힙으로 한 번 복사한 뒤, 힙에 복사된 영역을 참조 타입 객체가 가리키게 되는 일을 수행
🍣 언박싱(Unboxing)
- 참조 타입 객체를 값 타입으로 변환
- 힙에 있던 데이터를 다시 스택으로 복사하는 일을 수행
🍝 예시 코드
int i = 123;
object o = i;
o = 123;
i = (int)o;
🍛 사용 시 주의사항
- 박싱과 언박싱은 수행하는 데 많은 계산 과정이 필요하여 오버헤드가 발생할 수 있다.
- 어쩔 수 없이 박싱과 언박싱을 사용해야 하는 상황이라면 is 캐스팅을 통해 오류 없이 처리하는 과정이 필요하다.
- 박싱 과정
- 힙 영역에 새로운 메모리 할당
- 스택의 값을 힙 메모리로 복사
- 힙 메모리의 주소 값을 갖는 새로운 스택 메모리를 할당
→ 시간적 오버헤드 발생
- 언박싱
🍜 대체
🍱 foreach와 박싱
- 원래 foreach문 내부에서는 박싱이 일어나서 최적화 관점에서 좋지 않았다.
- struct인 Enumerator가 여러 interface를 상속 받는데, interface의 메서드를 호출하는 과정에서 Enumerator가 struct인지 class인지 알 수 없어서 전부 참조 형식으로 간주했기 때문
- 하지만 해당 이슈는 리팩토링을 통해 해결되었으며, 현재 for문과 foreach문의 성능적 차이는 거의 없다.
출처 - Microsoft Boxing 및 Unboxing(C# 프로그래밍 가이드)
출처 - [C# 문법] 박싱과 언박싱이란?
출처 - [C#] 박싱(Boxing)과 언박싱(Unboxing)이란?
출처 - C# 박싱과 언박싱이란? (개념 / 예제 / 사용 이유)
끗~~~