
배열과 리스트에 대해 배우면서 비슷하면서도 다른 점을 많다는 걸 알게 됬지만, 사용법이나 장단점에서 계속 헷갈리는 부분이 많아서 조금씩 나만의 언어로 정리해보려 한다.
배열과 리스트는 둘 다 데이터를 담아두는 바구니라고 볼 수 있다. 이렇게 데이터가 담긴 바구니에서 필요할 때 데이터를 찾아서 쓸 수 있기 때문에 데이터의 사용과 관리가 편해진다.
배열은 정해진 크기를 가지지만 리스트는 크기를 동적으로 유연하게 가져갈 수 있다. 그래서 정확한 크기(숫자)가 정해지지 않은 데이터를 다루기에는 리스트가 적합하다. 다만, 그만큼 메모리 사용량이 배열보다 많으므로 무분별한 사용은 피해야 한다.
정해진 위치가 있는 배열과 달리 리스트에 있는 데이터들은 서로 연결되서 존재하므로 리스트에 있는 데이터를 다루려면 각 데이터를 순회해야한다. 즉, 데이터를 다루는 시간이 증가한다.
또한 데이터를 추가하거나 삭제하는 등, 데이터를 다룸에 있어서 리스트의 방법이 배열보다 복잡하므로 코드 복잡도가 증가하게 된다.
배열
int[] array = new int[3]; // 3칸짜리 빈 배열 생성
int[] array = new int[] {1, 2, 3}; // 빈 배열 생성하고 즉시 3칸 생성, 데이터 배치
int[] array = [1, 2, 3]; // 3칸짜리 데이터 들어간 배열 생성
리스트
List<int> list = new List<int>();
위와 같이 리스트는 만들 때 몇 칸짜리 배열인지에 대한 선언이 들어가야하지만, 리스트는 그냥 리스트 생성을 선언만 하고 나중에 데이터를 집어넣어도 충분하다.
배열
array[0] = 1;
array[1] = 2;
array[2] = 3;
리스트
list.Add(1);
데이터를 추가하려면 배열은 정확한 칸을 선언하고 넣어야 하지만, 리스트는 그냥 넣으면 된다.
배열
int i = array[0];
리스트
int i = list[1];
배열은 배열의 칸을 선언하면 되지만, 리스트는 리스트에 있는 어떤 데이터인지를 직접 선언해서 꺼내야 한다.
배열
int sum ;
for (int i = 0; i < array.Length; i++)
{
sum += array[i];
}
리스트
int sum;
foreach (int number in list)
{
sum += number;
}
배열은 for구문으로도 반복 할 수있고, i의 초기값등을 조절하여 자유롭게 데이터를 반복해서 활용할 수 있지만, 리스트는 foreach를 통해 모든 데이터를 돌려야한다.
배열
array[0] = 0;
리스트
list.Remove(1);
배열은 칸이 사라지지 않기 때문에 해당 데이터를 삭제하거나 초기화 하려면 해당 자료형의 초기값을 대신 넣어줘야 한다(사실상 삭제란 개념이 없다.).
리스트는 제거하려는 데이터를 직접 선언해서 완전히 삭제해버리는게 가능하다.
배열과 리스트는 비슷해 보이지만 위와 같이 많은 차이점을 가지고 있기 때문에 코드를 짤 때 내가 지금 다루려는 데이터가 어떠한 크기를 가질지, 어떻게 활용될 껀지 충분히 심사숙고해서 선택해야한다.