1. 박싱과 언박싱이란?
박싱(Boxing)
박싱은 값 형식을 참조 형식으로 변환하는 과정입니다. 값 형식은 'int', 'float', 'double', 'struct' 등과 같은 데이터 타입이며, 이들은 스택(Stack) 메모리에 저장됩니다. 박싱을 통해 값 형식을 힙(Heap) 메모리에 할당된 객체(Object 타입)로 변환하여 참조 형식처럼 다룰 수 있게 됩니다.
언박싱(Unboxing)
언박싱은 박싱된 객체를 다시 값 형식으로 변환하는 과정입니다. 힙에 저장된 객체에서 값을 꺼내와 스택에 저장합니다. 이 과정에서 타입 검사와 캐스팅이 필요합니다.
2. 작동 구조 및 예제
박싱의 작동 구조
- 값 형식 데이터를 힙에 할당: 값 형식 데이터를 힙에 새로운 객체로 할당합니다.
- 객체 생성: 이 객체는 해당 값 형식의 데이터를 포함합니다.
- 데이터 복사: 값 형식의 데이터를 복사하여 힙에 할당된 객체에 저장합니다.
- 참조 생성: 값 형식을 가리키는 참조가 생성됩니다.
언박싱의 작동 구조
- 참조 가져오기: 박싱된 객체의 참조를 가져옵니다.
- 값 추출: 힙에 저장된 객체에서 값 형식 데이터를 추출합니다.
- 데이터 복사: 이 데이터를 스택에 있는 값 형식 변수에 복사합니다.
예제
int num = 123;
object boxedNum = num; //박싱 진행
int unboxedNum = (int)boxedNum; //언박싱 진행
3. 장단점
장점
- 유연성: 값 형식을 참조 형식으로 변환하여 다양한 컬렉션이나 메서드에서 사용할 수 있습니다.
단점
- 성능 저하: 박싱과 언박싱은 힙 메모리 할당과 가비지 컬렉션을 유발하므로 성능 저하가 발생할 수 있습니다.
- 런타임 오류 가능성: 언박싱시 타입 불일치로 인한 예외가 발생할 수 있습니다.
4. 제네릭(Generics) 설명과 오브젝트(Object) 타입과의 차이점
제네릭이란?
제네릭(Generics)은 C#에서 데이터 타입에 의존하지 않고 데이터 구조와 메서드를 정의할 수 있는 기능을 제공합니다. 제네릭을 사용하면 컴파일 타입에 데이터 타입을 지정하지 않고 런타임에 필요에 따라 다양한 데이터 타입을 사용할 수 있습니다.
이 둘은 데이터 타입을 명시하지 않고 다양한 데이터 타입을 다룰 수 있게 하지만 차이점이 존재합니다.
차이점
1. 타입 안정성
- 박싱/언박싱: 타입 안전성이 낮고, 런타임에 타입 오류가 발생할 수 있습니다. 예를 들어, 언박싱 시 타입 불일치로 오류가 발생할 수 있습니다.
- 제네릭: 컴파일 타입에 타입을 확인하여 타입 안전성을 보장합니다.
2. 성능
- 박싱/언박싱: 박싱과 언박싱은 힙 메모리 할당과 가비지 컬렉션을 유발하므로 성능 저하가 발생할 수 있습니다.
- 제네릭: 제네릭은 박싱과 언박싱을 피할 수 있어 성능이 향상됩니다. 값 형식도 제네릭틀 통해 직접 사용할 수 있습니다.
3. 메모리 관리
- 박싱/언박싱: 박싱 시 힙메모리를 사용하고, 가비지 컬렉션의 대상이 됩니다.
- 제네릭: 제네릭은 스택 메모리를 더 많이 사용하고, 힙 메모리 사용을 최소화하여 메모리 관리가 효율적입니다.
4. 코드 재사용성
- 박싱/언박싱: 박싱과 언박싱을 통해 일반화된 코드를 사용할 수 있지만, 타입 불일치와 성능 문제로 인해 코드 재사용성이 제한적일 수 있습니다.
- 제네릭: 제네릭을 사용하면 타입에 상관없이 동일한 코드를 재사용할 수 있으며, 코드의 가독성과 유지보수성이 향상됩니다.
5. 정리
박싱: 값 형식을 참조 형식으로 변환하여 힙에 할당하는 과정
언박싱: 참조 형식인 객체를 다시 값 형식으로 변환하는 과정
성능 이슈: 박싱과 언박싱은 힙 메모리 할당과 가비지 컬렉션을 유발할 수 있으므로 성능에 영향을 줄 수 있어 제네릭 사용을 권장합니다.
지금까지 박싱과 언박싱에 대해 알아보았습니다.
현재 글의 내용 중 틀린 부분이나, 지적하실 내용이 있으시다면 언제든지 알려주세요! 읽어주셔서 감사합니다.
'CS 공부' 카테고리의 다른 글
[C#] 가비지 컬렉터 (Garbage Collector, GC) (0) | 2024.07.15 |
---|---|
[C#] Virtual, Abstract, Interface (0) | 2024.07.09 |
[C#] 해시셋 (HashSet) (0) | 2024.06.28 |
[C#] 링크드 리스트 (Linked List) (0) | 2024.06.23 |
[C#] 딕셔너리 (Dictionary) (0) | 2024.06.21 |