[C# 문법] 박싱과 언박싱이란?
- C#/C# 문법
- 2021. 5. 9. 11:47
참조 사이트
- https://huiyu.tistory.com/entry/Effective-C-Boxing-Unboxing?category=833630
- https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/types/boxing-and-unboxing
값 타입(Value Type)
- 값 타입(Value Type) 은 스택영역 에 저장합니다. (int, char, double...)
- 값 타입은 Object를 상속받은 System.ValueType을 상속받은 구조체입니다. (System.ValueType)
- int -> System.Int32로 정의. 상속관계는 Object -> ValueType -> Int32
- char -> System.Char로 정의. 상속관계는 Object -> ValueType -> Char
참조 타입(Reference Type)
- 모든 타입의 base class인 System.Object를 상속받으며, 힙 영역에 저장됩니다.
- 값 형식은 해당 데이터에 직접 값이 저장된다면, 참조 타입은 데이터에 대한 참조가 저장됩니다.
- 참조 타입은 처음 변수를 선언하면 값 타입과 달리 메모리가 생성되지 않습니다.
Class A
{
}
A a = null; // 메모리 생성되지 않음.
- 이후 A를 생성한다면 실제 생성된 A는 힙에 메모리를 할당, a는 그 값에 대한 참조만 스택에 저장합니다.
A a = new A(); // 메모리 생성, 변수 a는 생성된 A의 참조(주소)만 갖게 됨.
- a를 새로운 aa에 할당한다면 새로운 메모리를 할당하지 않고 참조하는 값만 복사
A aa = a; // 새로운 메모리를 할당하지 않고, a의 참조 값을 갖는 값만 복사함.
박싱(Boxing)
- 값 타입(Value Type)의 객체를 참조 타입(Reference Type)로 변환하는 작업을 말합니다.
int i = 123;
object o = i; // 박싱
Console.WriteLine(o.ToString());
- 단순한 형변환 같지만 값 타입은 스택에 저장되어 있고 참조 타입은 힙에 저장되어 있습니다.
- 그래서 위 과정을 수행하기 위해선 스택에 저장된 값 타입을 힙 타입으로 복사가 한번 일어납니다.
- 그리고 힙에 복사된 이 영역을 참조 타입이 가리키게 되는 일을 수행합니다.
언박싱(UnBoxing)
- 참조 타입을 값 타입으로 변환하는 작업을 말합니다.
int i = 123; // a value type
object o = o; // boxing
int j = (int)o; // unboxing
- 박싱과 반대로, 힙에 있던 데이터를 다시 스택으로 복사가 일어납니다.
- 박싱과 언박싱은 System.Object 타입이나 인터페이스 타입이 필요한 부분에 Value 타입의 객체를 적용하기 위해서 필요한 기능이지만 가능하면 쓰지 않는 것이 좋습니다.
728x90
'C# > C# 문법' 카테고리의 다른 글
[C# 문법] 로컬 IP 주소 가져오는 방법 (0) | 2021.05.23 |
---|---|
[C# 문법] C#에서 외부 프로그램 실행 시키기 (ProcessStartInfo 클래스) (2) | 2021.05.09 |
C# Tuple 이용하여 메서드 여러개 변수 반환하기 (0) | 2021.05.05 |
[C# 문법] C# 클래스 객체 깊은복사(DeepClone) 하는 방법 (0) | 2021.04.18 |
[C# 문법] List<string> 을 List<decimal> 형식으로 형변환 하는 방법 (1) | 2021.04.11 |
이 글을 공유하기