Language/C#

[C#] Array와 List의 차이점, 각각을 어느 상황에 써야 할까?

범데이 2023. 1. 28. 16:09
728x90

개요

C#을 다루다 보니 배열을 사용할 때가 종종 생겼고, Array와 List를 알게되며

비슷한듯 차이점이 있는 두 컬렉션에 대해 알아보게 되던 중,

 

잘 정리된 외국 포스트가 있어서 직접 번역하여 포스팅하게 되었다.

(원본 포스팅: https://www.shekhali.com/c-array-vs-list/)

 

 


1. Array vs List

List<T>는 요소가 추가되고 제거될 때 자동으로 크기를 조정할 수 있는 일반 컬렉션인 반면,

Array는 같은 타입들의 요소에 대한 고정 크기의 순 컬렉션이다.

 

Array

C# Array: Array는 실행 중에 수정할 수 없는 고정 길이를 가진 동일한 데이터 타입의 엄격한 자료형*의 collections 이다.

(*엄격한 자료형(strongly typed)란? 함수/메서드에 전달하는 객체나 값의 타입이 프로그래머의 의도와 다를 때, 컴파일러가 에러를 내거나 컴파일을 거부하는 식으로 타입을 엄격하게 맞춘다는 의미이다.)

 

Array의 요소들은 숫자 index를 사용하여 액세스할 수 있으며 0부터 시작한다. numeric 배열 항목의 기본값은 0이고 reference 배열 항목 요소의 기본값은 null이다.

Array는 System.Array 네임스페이스에 있다. 대괄호([]) 안에 지정할 변수 유형(정수, 문자열 등) 및 배열 이름과 함께 지정해야 한다.

 

Array 생성

다음은 이름이 intArray인 정수 배열을 정의하는 방법의 예이다.

int[] intArray = new int[5]; // Array가 길이 5를 가진다.
int[] intArray = new int[] {10, 20, 30, 40, 50 };

 

 

 

Array의 요소 접근

아래와 같이 작성하여 string Array를 만들수 있다.

using System;
namespace CSharpArrayExample
{
    public class CSharpArrayExample
    {   
        static void Main(string[] args)
        {
            // Array 선언
            string[] fruitsName = { "Apple", "Orange", "Banana", "Grapes"};
 
            // index를 사용하여 Array의 요소에 액세스
            Console.WriteLine(fruitsName[0]); // 출력: Apple
 
            // for loop문을 사용하여 요소들에 액세스
            for(int index = 0; index < fruitsName.Length; index ++)
            {
                Console.WriteLine(fruitsName[index]);
            }
 
            Console.ReadKey();
        }
        
        // 출력:
        // Apple
        // Orange
        // Banana
        // Grapes
    }
}

 


List

List<T>: C#에서 List는 index 또는 loop를 통해 액세스할 수 있는 강력한 형식의 개체 컬렉션을 나타내는 데 사용되는 제네릭 형식이다. List 클래스는 System.Collection.Generic 네임스페이스에서 사용할 수 있다.

엄격한 자료형의 Object 컬렉션에서 요소를 검색, 정렬, 조작, 추가 및 제거할 수 있다.

C# List에는 요소가 추가되거나 제거될 때 동적으로 크기를 조정하는 기능과 같은 많은 추가적인 특징이 있다.

(List에 대해 더 많은 정보를 참고하려면 → https://www.shekhali.com/csharp-list-class/)

 

 

구문

다음은 일반적인 List<T>를 선언하는 구문이다. List의 매개변수 T는 List의 항목 유형을 나타내며 int, long, string, 또는 사용자 정의 객체일 수 있다.

List<T> myList = new List<T>();

 

C# List<T> 예제

다음은 C#의 List 사용 예제이다.

using System;
using System.Collections.Generic;
namespace CSharpListExample
{
    public class CSharpArrayExample
    {   
        static void Main(string[] args)
        {
            // string 타입의 일반 리스트 선언
            List<string> fruitsName = new List<string>();
           
            // List에 항목 추가
            fruitsName.Add("Apple");
            fruitsName.Add("Orange");
            fruitsName.Add("Banana");
            fruitsName.Add("Grapes");
             
            // index를 사용하여 List의 요소에 액세스
            Console.WriteLine(fruitsName[0]); // 출력: Apple
 
            // for loop를 사용하여 리스트의 요소에 액세스
            for(int index = 0; index < fruitsName.Count; index ++)
            {
                Console.WriteLine(fruitsName[index]);
            }
 
            Console.ReadKey();
        }
        
        // 출력:
        // Apple
        // Orange
        // Banana
        // Grapes
    }
}

 

 

2. Array와 List 비교

파라미터 C# List C# Array
1. 길이 항목이 추가되거나 제거될 때 동적으로 사이즈가 변한다. 크기가 고정되어 있으므로, 동일한 데이터 유형의 고정된 개수의 요소만 저장할 수 있다.
2. 네임스페이스 System.Collection.Generic 네임스페이스에 속해있다. System.Array 네임스페이스에 속해있다.
3. 메모리 동적이며 무작위이다.

List에 정의된 각 노드에는 자체 메모리 세트가 있으므로 List는 Array보다 더 많은 메모리를 차지한다.
정적이며 연속적이다.
메모리 효율적이다.
4. 활용 요소를 자주 추가하고 제거할 때 유용하다. 변경 가능성이 없는 고정된 수의 요소가 있고 비순차적 방식으로 자주 액세스하려는 경우에 편리하다.
5. 속도 실행 속도가 느리다. 실행 속도가 더 빠르다.
6. 메모리 관리 메모리 낭비가 없다. 메모리 낭비는 Array의 문제점이다.
Array에 할당된 많은 메모리 블록은 고정 크기 메모리가 할당된 후 새 항목이 추가될 때까지 사용되지 않은 상태로 유지된다.
또한 다른 프로세스에 할당할 수 없으므로 메모리 낭비가 발생한다.
7. 메모리 구조 비연속 메모리 할당이 수행된다.
비연속 메모리 할당은 프로세스를 다양한 블록으로 분리하며, 이후 메모리 공간 가용성에 따라 메모리의 다른 주소 공간에 배치된다.
비연속 메모리 할당은 페이징 및 분할로 설명된다.
연속 메모리 할당이 수행된다.
연속 메모리 할당 기술은 요구 사항에 따라 프로세스에 단일 연속 메모리 블록을 할당한다. 메모리 공간은 고정된 크기의 파티션으로 나뉘고 각 파티션은 하나의 프로세스에만 할당된다.

 

 

 

 


#References

https://www.shekhali.com/c-array-vs-list/

https://www.w3schools.com/cs/cs_arrays.php

https://www.shekhali.com/csharp-list-class/

 

반응형