리스트(List)의 개념 및 구현

2024. 9. 20. 20:48Data Structure

자료구조 리스트(List) 이해하기

리스트(List)는 데이터들을 순차적으로 저장하고 관리할 수 있는 가장 기본적인 자료구조 중 하나입니다.
C#에서는 List<T> 제네릭 컬렉션 클래스를 사용하여 리스트를 구현할 수 있으며, 다양한 데이터를 손쉽게 저장하고 조작할 수 있습니다. 이번 포스팅에서는 리스트의 정의, 사용법, 장점과 단점에 대해 알아보겠습니다.


1. 리스트란?

리스트는 동적 배열이라고도 불리며, 데이터가 추가되면 크기가 자동으로 확장되는 특성을 가집니다.
배열과 달리 크기가 고정되어 있지 않으며, 삽입과 삭제가 더 유연합니다.
리스트는 순서가 있는 데이터 구조로, 데이터를 저장한 순서대로 접근할 수 있습니다.


2. C#에서의 리스트 사용법

C#에서 리스트는 System.Collections.Generic 네임스페이스의 List<T> 클래스를 사용하여 선언할 수 있습니다.
T는 리스트에 저장될 데이터의 타입을 나타냅니다.

2.1. 리스트 선언 및 초기화

리스트를 선언하고 데이터를 추가하는 기본적인 코드 예시는 다음과 같습니다:

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        // 정수형 리스트 선언
        List<int> numbers = new List<int>();

        // 리스트에 요소 추가
        numbers.Add(1);
        numbers.Add(2);
        numbers.Add(3);

        // 리스트 출력
        foreach (int number in numbers)
        {
            Console.WriteLine(number);
        }
    }
}

위 코드는 정수형 리스트를 생성하고 데이터를 추가한 뒤, 리스트의 모든 요소를 출력하는 예시입니다.


2.2. 리스트 초기화

리스트는 선언과 동시에 데이터를 초기화할 수도 있습니다.

List<string> fruits = new List<string> { "Apple", "Banana", "Cherry" };

2.3. 리스트에 데이터 추가 및 삭제

리스트는 배열과 달리 크기가 동적으로 조절되므로, 데이터를 쉽게 추가하거나 삭제할 수 있습니다.

요소 추가

  • Add(T): 리스트에 요소를 추가합니다.
  • Insert(index, T): 특정 위치에 요소를 추가합니다.
numbers.Add(4); // 리스트의 끝에 추가
numbers.Insert(1, 10); // 인덱스 1 위치에 추가

요소 삭제

  • Remove(T): 특정 값을 가진 요소를 삭제합니다.
  • RemoveAt(index): 특정 인덱스의 요소를 삭제합니다.
numbers.Remove(2); // 값 2를 삭제
numbers.RemoveAt(0); // 인덱스 0의 요소 삭제

2.4. 리스트의 크기와 용량

리스트는 동적이므로 크기를 수동으로 조정할 필요는 없지만, Count 속성과 Capacity 속성을 통해 현재 요소의 개수와 리스트가 실제로 얼마나 많은 데이터를 저장할 수 있는지 확인할 수 있습니다.

Console.WriteLine($"Count: {numbers.Count}");   // 리스트에 있는 요소 개수
Console.WriteLine($"Capacity: {numbers.Capacity}"); // 내부적으로 할당된 공간

2.5. 리스트 검색 및 정렬

리스트는 다양한 검색 및 정렬 메서드를 제공합니다.

검색

  • Contains(T): 리스트에 특정 값이 포함되어 있는지 확인합니다.
  • IndexOf(T): 특정 값의 인덱스를 반환합니다.
bool containsThree = numbers.Contains(3);
int index = numbers.IndexOf(3);

정렬

  • Sort(): 리스트의 요소를 오름차순으로 정렬합니다.
  • Reverse(): 리스트의 요소를 역순으로 배치합니다.
numbers.Sort(); // 오름차순 정렬
numbers.Reverse(); // 역순 정렬

3. 리스트의 장점과 단점

장점:

  • 동적 크기: 데이터가 추가되면 자동으로 크기가 조정되어, 배열처럼 미리 크기를 지정할 필요가 없습니다.
  • 유연한 데이터 추가/삭제: 중간에 데이터를 삽입하거나 삭제하는 작업이 배열에 비해 용이합니다.
  • 제네릭 지원: List<T>는 제네릭이므로, 타입 안전성을 보장하면서도 다양한 타입의 데이터를 저장할 수 있습니다.

단점:

  • 연속된 메모리 할당: 리스트는 연속된 메모리 공간을 사용하므로, 리스트가 커지면 성능 문제가 발생할 수 있습니다.
  • 삽입/삭제 성능 저하: 중간에 데이터를 삽입하거나 삭제할 때는 해당 위치 이후의 데이터를 모두 이동해야 하므로, 배열에 비해 성능이 저하될 수 있습니다.

4. 배열 vs 리스트

배열:

  • 고정된 크기: 배열은 선언 시 크기가 고정되며, 이후에는 크기를 변경할 수 없습니다.
  • 빠른 접근: 배열의 인덱스 접근은 빠릅니다.

리스트:

  • 동적 크기: 리스트는 크기가 동적이며, 데이터를 추가하거나 삭제할 때 자동으로 크기가 조정됩니다.
  • 편리한 메서드 제공: 리스트는 데이터를 다루기 위한 다양한 메서드를 제공합니다.

C#의 List<T> 클래스는 동적으로 크기를 조정할 수 있는 매우 유용한 자료구조입니다.
배열에 비해 유연한 데이터 추가 및 삭제가 가능하며, 다양한 메서드를 통해 데이터를 손쉽게 관리할 수 있습니다.
리스트는 다양한 상황에서 사용될 수 있으며, 데이터의 크기와 형태에 따라 배열이나 리스트 중 적절한 자료구조를 선택할 수 있습니다.