[C#] Array와 List의 차이점, 각각을 어느 상황에 써야 할까?
개요
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/