C# 메모리 관리 – 배열 재사용 Array Reuse

C# 메모리 관리 – 배열 재사용 Array Reuse

memory management

배열 재사용 Array Reuse

오브젝트를 재사용하는 것과 함께 사용을 고려해볼 만한 것이 바로 버퍼를 생성해서 코드를 재사용하는 것입니다. 이 버퍼에 여러 코드에서 사용되거나, 같은 코드에서 여러 차례 사용되는 내용을 저장해서 재사용하는 것입니다. 배열이나 리스트List 는 힙Heap에 할당되기 때문에 Update 함수나 자주 호출되는 다른 함수에서 배열을 생성하게되면 가비지 컬렉션을 자주 발생시키는 원인이될 수 있습니다.

void Update()
{
      if(readyToFire && Input.GetKeyDown(KeyCode.F))
      {
          var nearestFiveEnemies = new Enemy[5];
 
          //Do something to fill out the list finding the nearest
          //enemies
 
          TargetEnemies(nearestFiveEnemies);
      }
}

이 예제는 가장 가까운 5개의 적군을 찾고 그 적군들에게 무기를 발사하는 것이 목표입니다. 문제는 발사 버튼을 누를때마다 매번 메모리를 할당한다는 것입니다.
이렇게 하는 대신 적군 정보를 저장하는 배열을 만들고 코드 어디에서나 사용할 수 있도록 하면, 매번 메모리를 할당하지 않아도 되고, 그로 인해서 속도가 저하되는 것도 피할 수 있습니다.

위의 예제 코드는 아래와 같이 간단히 바꿀 수 있습니다.

Enemy[] _nearestFiveEnemies = new Enemy[5];
 
void Update()
{
      if(readyToFire && Input.GetKeyDown(KeyCode.F))
      {
          //Do something to fill out the list finding the nearest
          //enemies
 
          TargetEnemies(_nearestFiveEnemies);
      }
}

그리고 좀 더 다양한 곳에서 사용하기 위해서 적군 정보를 저장하는 배열의 크기를 더 크게 할당할 수도 있습니다.

Enemy[] _enemies = new Enemy[100];
 
void Update()
{
      if(readyToFire && Input.GetKeyDown(KeyCode.F))
      {
          //Do something to fill out the list finding the nearest
          //enemies
 
          TargetEnemies(_enemies, 5);
      }
}

필요한 적군의 수를 TargetEnemies 함수에 파라미터로 추가하면, 좀 더 광범위하게 사용할 수 있도록 만든 배열을 코드 어디에서나 효율적으로 사용할 수 있습니다. 또한 추가로 필요할 수 있는 메모리 할당도 피할 수 있습니다.

두 번째 예제는 다소 극단적인 경우입니다. 따라서 크기가 매우 큰 컬렉션을 할당하게 되면 오히려 메모리 문제를 야기할 수도 있습니다 – 일반적으로 읽기 쉽고, 몇 바이트를 줄일 수 있는 이해하기 쉬운 코드를 작성하는 것이 좋습니다.

 

내용 끝까지 읽어주셔서 감사합니다.
배너 클릭은 저에게 많은 힘이 됩니다.
감사합니다 🙂

RonnieJ

프리랜서 IT강사로 활동하고 있습니다. 게임 개발, 웹 개발, 1인 기업, 독서, 책쓰기에 관심이 많습니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다