C# 박싱(boxing), 언박싱(un-boxing)

김민구·2024년 10월 25일
0

C#

목록 보기
2/31

박싱(boxing), 언박싱(un-boxing)이란

  • 박싱(boxing) = 값타입에서 참조타입으로 변환하는 과정
  • 언박싱(un-boxing) = 참조타입에서 값타입으로 변환하는 과정

값(value type type)형식과 참조(reference type)형식이란

  • 값(value type type)형식 = 개체에 값 자체를 담고 있는 구조, int, double 등의 자료형은 기본저긍로 값 형식의 데이터 구조
    ㄴ 메모리의 스택 영역에 저장된다.
  • 참조(reference type)형식 = 개체에 값을 담고 있는 또 다른 개체를 포인터로 가르키는 구조, object형은 대표적인 참조형식이다.
    ㄴ 메모리의 힙 영역에 저장된다.

메모리 구조

  • 메모리의 구조는 크게 4가지로 구분된다.
  • 코드(code)영역, 데이터(data)영역, 스택(stack)영역, 힙(Heap)영역 이다.
    ㄴ 코드(code)영역은 메모리에 실행할 프로그램의 코드가 저장되는 영역 = 코드가 기계어로 저장되며, 이를 CPU가 처리
    ㄴ 데이터(data)영역은 프로그램의 전역 변수와 정적(static)변수가 저장되는 영역 = 데이터 영역은 프로그램 시작과 함께 할당되며, 프로그램이 종되면 메모리에서 해제된다.
    ㄴ 스택(stack)영역은 임시 메모리 영역으로 함수호출과 관련된 지역변수와 매개변수, 반환(return)값이 저장되는 영역이다. = 함수가 호출될떄 할당되며, 함수의 호출이 끝나면 메모리에서 해제된다.
    ㄴ 힙(Heap)영역은 프로그래머가 필요할때 마다 사용하는 메모리 영역으로 프로그래머가 관리해야하는 메모리 영역이다. = C의 경우 힙 영역의 메모리를 동적 할당 후 사용하고 난 후에는 반드시 메모리를 해제해주어야 하나 C#이나 기타 언어들은 가비지 컬렉터(Garbage Collection)가 특정 시점에 자동으로 관리해준다.

메모리 상호작용

  • 스택(Stack)영역과 힙(Heap)영역에서 메모리가 주소의 방향에 따라 할당된다.
    스택 영역과 힙 영역은 메모리의 같은 공간을 사용한다. 즉 스택 영역이 클 수록 힙 영역은 작아지고 반대로 힙 영역이 커지면 스택 영역이 작아지게 된다.

    스택 영역 메모리 할당: 높은 주소 >> 낮은 주소
    힙 영역 메모리 할당: 낮은 주소 >> 높은 주소

  • 스택과 힙이 같은 공간을 공유하고 있기 때문에 자신의 영역을 벗어나 상대의 영역을 침범하는 overflow가 발생할 수 있다.

  • 스택 영역이 힙 영역을 침범하면 stack overflow, 힙 영역이 스택 영역을 침범하면 heap overflow라고 한다.

박싱(boxing), 언박싱(un-boxing)을 지양하는 이유

  • 박싱과 언박싱 과정에서 추가적인 비용이 발생, 박싱을 할 때마다 새로운 객체가 생성되어 힙에 메모리를 할당받아야 하므로 성능 저하의 원인이 될 수 있고 빈번하게 사용된다면 박싱과 언박싱 연산(여러번의 메모리 참조)이 반복되며 성능 저하가 누적되어 성능 저하가 발생한다.
  • 박싱된 개체는 힙 영역에 저장되는데, 더 넓은 범위의 메모리를 이용하여 다양한 객체들을 저장할 수 있으나, 처리 속도가 스택에 비해 느리다.

박싱(boxing), 언박싱(un-boxing)의 성능 저하 해결 방안

  • 제네릭(Generic)을 사용함으로써 성능 저하를 해결할 수 있다.
    ㄴ ArrayList는 내부적으로 object의 배열을 가지고 있는 대표적 박싱 형태이다.

  • 아래와 같이 ArrayList가 생성되면 하기의 그림과 같이 저장된다.

ArrayList arr = new ArrayList();
arr.Add(1);
arr.Add(2);

  • 제네릭 형태로 배열을 지정하였을때 값 자체가 저장되어 박싱 언박싱에 할당되는 자원을 절약할 수 있다.
List<int> list = new List<int>();
list.Add(1);
list.Add(2);

profile
C#, Unity

0개의 댓글