Unity 개발일지

[C#] 정적배열(Array)과 동적배열(Dynamic Array) 본문

C#

[C#] 정적배열(Array)과 동적배열(Dynamic Array)

아머르 2024. 4. 29. 19:57

일반적으로 "배열"이라 함은 정적배열을 의미하고 "동적 배열"이라고 명확하게 이야기해야 "동적 배열"을 뜻한다.

오늘은 이 둘의 차이와 동적배열인 ArrayList와 List를 알아보자.

 

정적배열(Array)

연관된 데이터를 메모리상에 연속적이며 순차적으로, 미리 할당된 크기만큼 저장하는 자료구조이다.

 

인덱스만 알고 있으면 조회를 빠르게 할 수 있어 조회를 자주해야하는 작업에서 Array 자료구조를 많이 사용한다.

Array를 선언할 때 크기를 미리 정해야 되므로 메모리낭비나 추가적인 overhead가 발생할 수 있다.

 

 

배열 - C#

C#의 배열 데이터 구조에 형식이 동일한 변수를 여러 개 저장합니다. 형식을 지정해 배열을 선언하거나 개체를 지정해 모든 형식을 저장합니다.

learn.microsoft.com

 

동적배열(Dynamic Array)

저장 공간이 가득 차는 경우 자동적으로 사이즈를 늘려 데이터를 추가/저장 할 수 있는 유동적인 자료구조.

저장공간(Capacity)를 넘어서는 경우 기존의 size보다 더 큰 Array를 선언하여 데이터를 옮긴 뒤, 기존의 Array는 삭제한다.

대표적인 예로 ArrayList와 List<T>가 있으며 글 작성일 기준 ArrayList보다는 List<T> 사용을 권장하고있다.

 

 

ArrayList 클래스 (System.Collections)

필요에 따라 크기가 동적으로 증가하는 배열을 사용하여 IList 인터페이스를 구현합니다.

learn.microsoft.com

그러므로 List<T>에 대해서 알아보도록 하겠다.

 

List<T> 클래스

List<T>는 배열요소가 T타입인 Generic으로 동적 배열을 지원하는 클래스이다.

.NET Generic 클래스들은 System.Colloection.Generic 네임스페이스 안에 있으며 List클래스는 내부적으로 배열을 가지고 있고, 동일한(Homogeneous) 타입의 데이터를 저장한다. 만일 Capacity가 부족하면 내부적으로 배열을 2배로 늘려 동적으로 배열을 확장한다. ArrayList와는 다르게 캐스팅을 할 필요가 없으며, 박싱 / 언박싱의 문제를 발생시키지 않는다.

리스트는 List<자료형> list =  new List<자료형>();의 형태로 선언하며 이후 중괄호로 값을 지정해줄 수 있다.

Add와 Remove로 값을 더하고 빼줄 수 있으며 Add는 리스트의 가장 마지막으로, Remove는 리스트 앞에서부터 시작해서 3이라는 값을 처음만났을 때 이 인덱스 값을 제거한다. 위에서는 1, 2, 4, 5만 남게 되는 것이다.

리스트에 저장된 값을 알고싶으면 for문과 foreach문을 이용하며 foreach문의 선호도가 높은편이다.

배열의 개수는 Count로 알 수 있다.

리스트에서 2라는 값을 처음 만났을 때 이 인덱스 값을 반환하고, 없으면 -1을 반환한다.

List의 정렬과 초기화

 

List사용시 유의할 점

1. Capacity를 넘어가면 재할당 후 복사하므로 비용이 크다.(반복문에서 빈번하게 일어날 경우)

2. Capacity가 증가될 시 Count에 따라 기하 급수적으로 커질 수 있다.

3. Capacity * T.Size 만큼 메모리를 잡고 있으므로 낭비가 크다.

List의 크기를 정해놨다면, List의 크기가 커질 것으로 예상된다면 Capacity 프로퍼티를 만드는 것도 좋은 방법이 될것이다.

 

 

List<T> 클래스 (System.Collections.Generic)

인덱스로 액세스할 수 있는 강력한 형식의 개체 목록을 나타냅니다. 목록의 검색, 정렬 및 조작에 사용할 수 있는 메서드를 제공합니다.

learn.microsoft.com

반응형