CS 공부

[C#] 박싱과 언박싱 (Boxing & Unboxing)

때류기 2024. 7. 2. 23:19

 

1. 박싱과 언박싱이란?

 

박싱(Boxing)

박싱은 값 형식을 참조 형식으로 변환하는 과정입니다. 값 형식은 'int', 'float', 'double', 'struct' 등과 같은 데이터 타입이며, 이들은 스택(Stack) 메모리에 저장됩니다. 박싱을 통해 값 형식을 힙(Heap) 메모리에 할당된 객체(Object 타입)로 변환하여 참조 형식처럼 다룰 수 있게 됩니다.

 

언박싱(Unboxing)

언박싱은 박싱된 객체를 다시 값 형식으로 변환하는 과정입니다. 힙에 저장된 객체에서 값을 꺼내와 스택에 저장합니다. 이 과정에서 타입 검사와 캐스팅이 필요합니다.

 

 

 

 


2. 작동 구조 및 예제

 

박싱의 작동 구조

  1. 값 형식 데이터를 힙에 할당: 값 형식 데이터를 힙에 새로운 객체로 할당합니다.
  2. 객체 생성: 이 객체는 해당 값 형식의 데이터를 포함합니다.
  3. 데이터 복사: 값 형식의 데이터를 복사하여 힙에 할당된 객체에 저장합니다.
  4. 참조 생성: 값 형식을 가리키는 참조가 생성됩니다.

 

 

언박싱의 작동 구조

  1. 참조 가져오기: 박싱된 객체의 참조를 가져옵니다.
  2. 값 추출: 힙에 저장된 객체에서 값 형식 데이터를 추출합니다.
  3. 데이터 복사: 이 데이터를 스택에 있는 값 형식 변수에 복사합니다.

 

예제

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