[C#] Array vs List vs ArrayList

2024. 11. 12. 18:59STUDY/C#

728x90
반응형

기본 개념

Array

연속적인 메모리상에 동일한 타입의 요소를 일렬로 저장하는 자료 구조로서, 배열 요소는 인덱스를 사용하여 직접적으로 접근할 수 있다. 배열은 고정된 크기를 가지며, 배열의 사이즈와 상관없이 한 요소에 접근하는 시간은 인덱스를 사용할 경우 O(1)이 된다. 하지만 인덱스를 알지 못하고 정렬되지 않은 배열에서 값으로 데이터를 찾기 위해서는 O(n)의 시간이 소요된다.

List

배열요소가 T 타입인 generic로서 동적 배열을 지원하는 클래스이다. list클래스는 내부적으로 배열을 가지고 있으며, 동일한 타입의 데이터를 저장한다. 만약 미리 할당된 배열 크기가 부족하면 내부적으로 배열을 2배로 늘려 동적으로 배열을 확장한다. arrayList와 다르게 박싱 / 언박싱의 문제를 발생하지 않는다.

ArrayList

모든 배열 요소가 object 타입인 Non-generic 동적 배열 클래스이다. 특징으로는 박싱 / 언박싱이 일어나게 된다. 그렇기 때문에 대게는 ArrayList보다 List을 사용할 것을 권장한다.

 

Array vs List

1. 메모리 할당 방식

배열 : 배열은 연속적인 메모리를 할당받는다. 즉, 배열은 선언과 동시에 지정된 크기만큼의 메모리를 미리 확보한다. 예를 들어 int[5] 배열을 선언하면 5개의 정수 값을 저장할 수 있는 메모리 공간을 한 번에 연속적으로 할당받는다.

리스트 : 리스트는 동적 메모리 할당을 사용하여 필요할 때마다 크기를 늘리거나 줄인다. 리스트는 초기화 시 용량(capacity)를 설정해두지만, 더 많은 요소가 추가될 때는 기존 용량의 두배로 큰 공간을 재할당하여 요소를 복사하고 새로운 메모리에 연결한다. 이 과정에서 오버헤드가 발생한다. 예를 들어 처음 용량이 4였다면 4개의 요소가 추가된 순간 용량이 8로 늘어나고, 다시 8개의 요소가 추가되면 용량은 16으로 증가한다.

2. 크기 변경 가능성

배열 : 선언 후 크기가 고정된다. 크기를 변경할 수 없으므로, 배열을 선언할때는 필요한 크기를 미리 예측해야 한다.

리스트 : 동적으로 크기가 조정된다. 요소를 추가하면 리스트의 크기가 자동으로 증가하고, 필요없는 요소를 제거하면 메모리를 회수하여 유연하게 사용할 수 있다.

 

어떤 상황에서 배열과 리스트를 사용해야 할까?

배열 사용이 적합한 경우 : 데이터의 크기가 고정적이고 변하지 않은 경우

예를들어 월별 데이터(12개)이나 요일(7개)와 같이 고정된 크기의 데이터를 처리할 때 유용하다. 또한 배열은 연속된 메모리 블럭에 데이터를 저장하기 때문에 캐시 활용 측면에서도 유리할 수 있다.

리스트 사용이 적합한 경우 : 데이터가 크기가 가변적이고, 요소 추가 및 삭제가 빈번히 발생하는 경우

 

참고 자료

728x90
반응형

'STUDY > C#' 카테고리의 다른 글

[C#] async, await  (0) 2024.12.04
[C#] 동기 비동기 개념 이해하기  (0) 2024.11.28
[C#] Class vs Struct  (0) 2024.11.06
interface는 인스턴스는 못 만들지만 참조는 만들 수 있다?  (1) 2024.10.03
[C#] List.Clear() vs List = null  (0) 2023.01.30