본문 바로가기
게임 개발 일지/내일배움캠프 TIL

[C#] 가비지 컬렉션 / 박싱과 언박싱

by 빛하_ 2024. 1. 23.

 

기술면접 대비하기 #3

 

7.가비지 컬렉션이란?

가비지 컬렉션이란 프로그래밍 언어에서 동적으로 할당된 메모리를 관리하기 위한 자동화 메모리 관리 기술이다.

이는 메모리 누수를 방지하고 코드 작성의 편의성과 안정성을 향상시키는데 도움을 준다. 

대표적인 가비지 컬렉션의 알고리즘은 다음과 같다.

1) Reference Counting

객체가 참조되는 횟수를 계산해 0이 되면 해당 객체를 해제한다.

2) Mark and Sweep

사용 중인 객체를 마킹하고 마크되지 않은 객체를 메모리에서 해제한다.

3) Generational

객체를 세대별로 나누어 객체 생성 초기에는 메모리 회수 빈도를 높이다가 점점 오래될수록 낮추는 방식. 

 

가비지 컬렉션은 가비지 컬렉터를 이용해 메모리를 관리하는 방법이다. 프로그래머가 직접 해제하지 않아도 자동으로 쓰레기를 처리해 주는 것이다. 시스템에서 더이상 사용하지 않는 동적 할당된 메모리 블럭을 찾아 회수하는 것으로, 가비지 컬렉션이 없다면 프로그래머가 메모리를 할당한 뒤 해제까지 직접 해야 한다. 

 

 

8.박싱과 언박싱이란?

값 형식의 데이터를 참조 형식으로 변환하는 것을 박싱, 그 반대를 언박싱이라고 한다.

값 형식은 스택 메모리에 저장되어 있고, 참조 타입은 힙 메모리에 저장되어 있다.

박싱은 스택에 있는 데이터를 힙으로 복사하는 작업인데, 암시적/명시적 형변환이 모두 가능하다.

 

암시적 형변환 : 변환할 자료형을 입력하지 않아도 됨. 작은 범위의 자료형에서 넓은 범위의 자료형으로 변환할 때.

명시적 형변환 : 코드에 직접 변환할 자료형을 입력해야 함. 

* 형변환 시 overflow(범위가 넘어갈 때 최대/최소값으로 출력되는 현상)가 발생하지 않도록 유의해야 함.

 

(8-1) 박싱, 언박싱을 사용할 때 주의 사항은?

박싱, 언박싱 과정은 오버헤드가 큰 편이다. 박싱은 하나의 값을 옮기는데도 메모리 참조가 많이 일어나 시간적 오버헤드가 발생한다. 언박싱의 경우는 추가로 가비지를 생성해 가비지 컬렉션을 동작시키는 잠재적 오버헤드까지 가지고 있다. 

최적화 관점에서 박싱과 언박싱은 지양하는 것이 좋으며 C#에서는 제네릭 함수를 사용해 박싱 비용을 절감시킬 수 있다.

 

 

 

댓글