[TIL] C# - Array / List vs ArrayList - day 60

뭉크의 개발·2023년 10월 11일
0

C# - Camp

목록 보기
18/18
post-thumbnail

🐧 들어가기 앞서

BSP를 이용한 3D 맵 생성기를 제작했는데,

콜라이더를 달아주니 메모리 누수가 심각하다.

오브젝트 풀링을 사용하거나 다른 방법을 찾아봐야겠다.


🐧 오늘 배운 것

메모리 / 자료구조(배열, 리스트, 연결 리스트)


🐧 기억할 것 & 진행

메모리

컴퓨터 메모리는 다양항 데이터 타입을 저장하기 위해 사용된다.

각 데이터 타입은 고유의 크기를 가지며, 이 크기는 해당 데이터 타입이 차지하는 메모리 공간을 결정한다.

예를 들어, int는 4byte를 차지하고, char은 2byte를 차지한다.

문자열(stirng)은 여러 개의 문자(char)로 구성되므로, 문자열의 길이에 따라 차지하는 메모리 공간도 변한다.

즉, "Chad"라는 문자열은 4개의 문자로 구성되어 있으므로, 총 8byte가 필요하다.

불변성 / Immutablity

문자열은 불변성(Immutablity)를 가진다. 한 번 생성된 문자열은 변경할 수 없다는 것을 의미하며, 기존의 할당된 메모리 공간에서 직접 수정하는 것이 아니라

새로운 공간에 변경된 내용을 저장한다.

즉, 기존의 메모리 공간은 Garbage가 되어 GC(Garbage Collector)에 의해 수거된다.

따라서 자주 변경되는 문자열 작업에서는 String Builder나 String interpolation 등을 이용하여 성능 저하 및 메모리 파편화 문제를 해결할 수 있다.

배열 / Array , 리스트 / List

  • 배열 (Array)
    크기가 고정되며, 인덱스를 통해 요소에 빠르게 접근할 수 있다. O(1)
    그러나 중간에 요소를 추가하거나 삭제하는 경우 비효율적이다.

  • 리스트(List)

    • 크기가 동적으로 변하며, 중간에 요소 추가 및 삭제가 가능하다. O(n)
      그러나 실제 배치된 배열의 크기와 List 객체 사이즈가 일치 하지 않아 추가적인 작업으로 성능 저하가 발생할 수 있다.

    • 리스트의 용량이 초과되면, 리스트는 기존 크기의 2배로 확장한다.
      즉, 처음에 4byte를 차지하던 리스트에 하나를 추가하면 새롭게 8byte 공간을 할당받아 사용한다.
      첫 번째 할당이 10byte라면, 이 크기가 초과될 때 마다 현재 크기의 두 배인 20 byte, 40 byte로 확장된다.

    • 즉, 최악의 경우 배열보다 효율이 떨어지는 경우가 있다.

연결 리스트 / LinkedList

  • 연결리스트는 기존 메모리 위치가 정해지면,(Head)
    새로운 데이터를 추가할 때 랜덤한 위치의 한 메모리 공간에 데이터를 할당한다.(Tail)

  • 각 요소가 다음 요소를 가리키는 방식으로 구성되어 있어 삽입 및 삭제가 용이하다. O(1)
    하지만 특정 요소에 접근하려면 첫 번째 요소부터 순차적으로 접근해야 하므로 접근 시간이 오래 걸린다. O(n)

  • 삽입, 삭제가 자유로워 파편화 현상이 일어나지 않는다.

  • 그러나 다음 배열을 찾으려면, 꼬리에 꼬리를 물어 찾아야 한다.

배열, 리스트 vs 연결 리스트

  • 배열, 리스트
    추가, 삭제 : O(n)
    접근 : O(1)

  • 연결 리스트
    추가, 삭제 : O(1)
    접근 : O(n)


🐧 내일 할 일

  1. BSP 메모리 누수 현상 해결하기

  2. README.md 작성

0개의 댓글