본문 바로가기
Study

자료구조, Array와 List 차이

by Client. DJ 2023. 10. 31.
반응형

기능상 차이 없는 배열과 리스트

배열과 리스트 왜 나눠져있을까?

작업을 하다보면 List와 Array 두 가지 타입을 접하게 되는데, 이 둘은 표면적으로는 기능이 비슷하지만, 상황에 맞게 골라야 합니다. 이 두 가지 데이터 타입은 서로 메모리에 접근하는 방식이 다르므로써 큰 차이가 있습니다.

Array (배열)

  • 데이터를 저장할 수 있는 길이가 고정이다.
  • 런타임 중에 수정이 어려우므로, 보통은 정해진 데이터들을 사용할 때 적합하다.
  • 저장되는 메모리가 연속적이다. 그러므로 탐색 속도가 List에 비해 상당히 빠르다.
  • 삽입/삭제 행위가 적거나 없는 정적인 데이터에 어울린다.

배열은 선언할 때부터 어느 정도 사용할지 정해놓고 사용합니다. 그래서 삽입/삭제에 대한 불편함이 따릅니다. 새로 다시 할당하거나, 삽입/삭제로 인한 변경된 길이 만큼의 메모리 영역을 복사해서 새로 할당할 수는 있지만, 이러한 과정이 매우 번거롭고, 오히려 비용이 많이 발생할 수 있습니다. 이러한 이유 때문에 배열을 굳이 리스트처럼 삽입/삭제하는 행위는 되도록이면 하지 않는 방향으로 사용합니다.

List (리스트)

  • 데이터를 저장할 수 있는 길이가 가변적이다.
  • 런타임 중, 유동적인 상황에 적합하다.
  • 저장되는 메모리가 비연속적이다. 탐색 속도가 Array에 비해 느리다.
  • 삽입/삭제 행위가 자주 사용되는 동적인 데이터 타입에 어울린다.

리스트에서 삽입(Add 또는 Insert)을 하는 경우, 위와 같은 그림처럼 정해진 위치의 메모리는 가져오는 것이 아닌 우리가 알 수 없는 위치의 메모리를 가져와서 할당합니다. 이것은 고정적인 메모리 영역을 차지하지 않기 때문에 가능한 구조입니다. 리스트에서는 마치 연속적으로 연결되어있는 것처럼 보이지만, 실제로는 서로 다른 위치를 하고 있습니다. 이와 같은 구조로 인해 삭제 행위가 매우 간단합니다.

예제

private static void Main(params string[] args)
{
    // 배열
    int[] numberArray = new int[] { 1, 2, 3, 4, 5 };
    for (int i = 0; i < numberArray.Length; i++)
    {
        Console.WriteLine(numberArray[i]);
    }

    // 리스트
    List<int> numberList = new List<int> { 1, 2, 3, 4, 5 };
    for (int i = 0; i < numberList.Count; i++)
    {
        Console.WriteLine(numberList[i]);
    }
}

차이가 없는 두 가지 타입의 데이터 형식, 하지만 내부적으로 작동하는 방식이 다릅니다. 여기서 재밌는 점은 Array는 Length를 쓰고, List는 Count를 쓰는 차이가 있는데, 앞서 설명했던 이유들로 인해 사용하는 용어 차이가 있습니다.

마무리

List는 런타임 중에 삽입/삭제 행위가 자주 있는 경우에 해당되며, Array는 런타임 중에 변화가 없는 경우 및 이미 정해진 데이터들로 구성되었을 때 해당됩니다. 알고 사용하면 좀 더 효율적인 코드를 작성할 수 있으며, 면접에서도 자주 물어보는 질문 중에 하나입니다.

 

List와 Array.pptx
0.05MB

반응형

댓글