박싱과 언박싱에 대한 개념은 잘모르지만 무의식적으로 코딩할 때 자연스럽게 쓰는
경우가 있다. 그렇기 때문에 박싱과 언박싱에 대한 개념을 확실히 알고 사용하면
좋을 것 같아서 이에 대해 설명하고자 한다.
박싱(boxing)이란?
boxing은 가비지에서 수집되는 힙에 값 형식을 저장하는 데 사용한다. 이를 풀어서
설명하자면 boxing은 값 형식을 object형식이나 값 형식에서 구현된 임의의 인터페이스
형식으로 암시적 변환을 한다. 그 다음 힙에 개체 인스턴스가 할당되고 값이 새 개체에 복사된다.
i라는 변수를 선언한 뒤 object o = i라는 박싱 연산을 적용하는 과정이다.
힙에서 개체 인스턴스가 할당되고 그 곳에 값 형식이 복사되는 것을 볼 수 있다.
언방식(unboxing)이란?
박싱은 값 형식에서 object, 인터페이스 형식으로 변환했다. 그럼 언박싱은 말 그대로
인터페이스나 object형식에서 값 형식으로 명시적으로 변환하는 과정이다.
박싱 과정에서는 값 형식을 개체 인스턴스가 할당된 힙 영역에 값 을 복사했다.
그럼 언박싱 과정은 힙 영역에 i라는 값 형식이 복사되어 있는 인스턴스 영역의 값을
int j라는 값 형식 변수에 복사한다.
여기서 주의할 점은 언박싱의 경우 무조건 박싱하여 생성된 개체에 대한 참조여야 한다.
null을 언박싱하면 NullReferenceException 오류가 발생하고 호환되지 않는 값 형식에
대한 참조를 언박싱하려고 하면 InvalidCastException 오류가 발생한다.
InvalidCastException이란 오류를 예시로 들면
처음엔 값을 int 형식으로 힙의 개체 인스턴스에 복사했다. 그럼 언박싱 할 때도
int 형식으로 변환하여 진행해야 하지만 개체에 대한 참조(int)가 아닌 short라는
다른 형태를 넣어버린 상황이다. 이러면 개체에 대한 참조가 아니기 때문에
캐스팅이 실패하고 오류메시지가 발생한다.
요약
박싱은 값 형식을 object 형식이나 값 형식에서 구현된 인터페이스로 암시적으로
변환하는 과정을 말한다 이 때 값은 힙의 개체 인스턴스에 복사된다. 언박싱은 object형식이나
인터페이스 형식에서 다시 값 형식 으로 명시적 변환하는 과정을 말한다. 이는 인스턴스에 복사된 값을
새로운 값 형식에 복사하는 과정이다.
주의할점은 박싱과 언박싱은 수행하는데 많은 계산 과정이 필요하다. 왜냐하면
박싱은 새로운 개체를 할당하고 생성해야 하고 언박싱은 캐스트에 상당한 계산과정이
필요하기 때문이다. 그래서 무분별하게 사용한다면 큰 성능 저하를 초래할 수 있다.
'TIL > C#' 카테고리의 다른 글
[C#] 제네릭 (0) | 2023.11.02 |
---|---|
[C#] 배열, List, ArrayList, Dictionary의 차이점 (1) | 2023.11.02 |
[C#] 가비지 컬렉션(Garbage Collection) (0) | 2023.10.31 |
[C#] 가비지 컬렉터 회피 전략 (0) | 2023.10.30 |
[C#] 가비지 컬렉터 (0) | 2023.10.27 |