값형식
- 형식의 값이 저장됨
- 새 값을 할당하면 개체 자체의 값이 복사됨
- System.ValueType에서 파생됨
- 구조체(숫자형식, bool, 사용자정의), 열거형 등의 형식 제공
참조형식
- 데이터에 대한 참조가 저장됨
- 새 값을 할당하면 개체의 참조가 복사됨
- class, interface, delegate, dynamic, object, string 등의 형식 제공
Boxing
- 값 형식을 object(혹은 object에서 파생된) 형식으로 변환하는 프로세스
- 암시적
- System.Object 내부에서 관리되는 힙에 할당되고 값이 복사됨
UnBoxing
- object(혹은 object에서 파생된) 형식에서 값 형식으로 변환하는 프로세스
- 명시적
- 인스턴스가 지정한 값 형식을 boxing한 값인지 확인 후 인스턴스의 값을 변수에 할당
예시코드
int valueType = 1;
object refType = valueType;
int valueType2 = (int)refType;
주의사항
* 비용 : 최대한 피하기
- boxing은 단순 참조보다 20배정도의 소요시간이 걸리고 unboxing의 캐스팅프로세스는 할당의 4배정도의 시간이 걸림
- ArrayList는 boxing, unboxing을 유발하므로 가능하면 List<T>를 사용하자
- 힙에 할당이 되었다는 것은 GC가 호출될 가능성이 있다는 것을 유의해야 함
* 예외 : try catch 사용, if로 조건 체크 등
- null을 unboxing 할 수 없음 => NullReferenceException
- 호환되지 않는 값 형식에 대한 참조를 unboxing 할 수 없음 => InvalidCastException