2 minute read

리스트(list)란?


리스트는 동적 배열(Dynamic Array)이라고도 불리며, 배열과 마찬가지로 데이터를 순차적으로 저장합니다. 하지만 배열과는 달리 리스트는 크기가 고정되어 있지 않아 데이터의 개수에 따라 자유롭게 크기를 조절할 수 있습니다. 리스트는 다음과 같은 특징을 가지고 있습니다.

  • 가변 크기: 데이터의 개수에 따라 크기가 자동으로 조절됩니다. 마치 고무줄처럼, 리스트는 필요에 따라 크기를 늘리고 줄일 수 있습니다.
  • 순차적인 저장: 데이터가 메모리 공간에 연속적으로 저장됩니다. 마치 기차의 객차처럼, 데이터들이 순서대로 연결되어 저장됩니다.
  • 빠른 접근: 인덱스를 사용하여 데이터에 빠르게 접근할 수 있습니다. 마치 책갈피를 이용하여 원하는 페이지를 바로 펼치는 것처럼, 리스트는 인덱스를 통해 원하는 데이터에 즉시 접근할 수 있습니다.

장단점


장점

  • 가변 크기: 데이터의 개수에 따라 크기가 자동으로 조절되므로 메모리 낭비를 줄이고 효율적인 데이터 관리가 가능합니다. 마치 필요한 만큼만 사용하는 컵처럼, 리스트는 메모리 공간을 효율적으로 사용합니다.

  • 삽입/삭제 용이: 데이터를 삽입하거나 삭제할 때 배열처럼 다른 데이터를 이동시킬 필요가 없어 효율적인 데이터 관리가 가능합니다. 마치 책꽂이 중간에 책을 넣거나 빼는 것처럼, 리스트는 데이터 삽입/삭제가 용이합니다.

  • 다양한 기능 제공: 다양한 메서드(Add, Insert, Remove, Find 등)를 제공하여 데이터를 쉽게 관리할 수 있습니다. 마치 만능 도구처럼, 리스트는 다양한 기능을 제공합니다.

단점

  • 메모리 재할당: 데이터의 개수가 변경되면 메모리 공간이 재할당될 수 있습니다. 마치 이삿짐을 옮기는 것처럼, 리스트는 데이터가 변경될 때 메모리를 재할당해야 할 수 있습니다.

  • 데이터 이동: 데이터를 삽입하거나 삭제할 때 데이터의 이동이 발생할 수 있습니다. 마치 줄 서 있는 사람들이 중간에 끼어들거나 빠져나가는 것처럼, 리스트는 데이터 삽입/삭제 시 데이터 이동이 발생할 수 있습니다.

  • 성능 저하 가능성: 대량의 데이터를 처리할 경우 성능 저하가 발생할 수 있습니다. 마치 많은 사람들이 한꺼번에 이동하는 것처럼, 리스트는 대량의 데이터를 처리할 때 성능 문제가 발생할 수 있습니다.

리스트의 활용 분야


  • 데이터 목록 관리: 학생 목록, 상품 목록 등 데이터를 순서대로 관리하는 데 사용됩니다.
  • 게임 개발: 게임 오브젝트의 목록, 아이템 목록 등 다양한 데이터를 관리하는 데 사용됩니다.
  • 웹 개발: 웹 페이지의 데이터를 처리하는 데 사용됩니다.
  • 데이터 분석: 데이터를 분석하고 처리하는 데 사용됩니다.

문제점&주의사항


  • 메모리 재할당: 리스트의 크기가 변경되면 메모리 공간이 재할당될 수 있습니다. 이는 성능 저하를 유발할 수 있으므로, 리스트의 크기 변화를 최소화하는 것이 좋습니다. 마치 집을 증축하는 것처럼, 리스트는 크기가 변경될 때 메모리를 재할당해야 할 수 있습니다.

  • 데이터 이동: 데이터를 삽입하거나 삭제할 때 데이터의 이동이 발생할 수 있습니다. 이는 성능 저하를 유발할 수 있으므로, 삽입/삭제 연산을 최소화하는 것이 좋습니다. 마치 책꽂이 중간에 책을 넣거나 빼는 것처럼, 리스트는 데이터 삽입/삭제 시 데이터 이동이 발생할 수 있습니다.

  • 성능 고려: 대량의 데이터를 처리할 경우 리스트의 성능 저하가 발생할 수 있습니다. 이 경우 다른 자료구조(예: 연결 리스트)를 사용하는 것을 고려해야 합니다. 마치 고속도로를 이용하는 것처럼, 리스트는 대량의 데이터를 처리할 때 성능 문제가 발생할 수 있습니다.

예제


기본적인 list 예시 코드

using System;
using System.Collections.Generic;

class ListSample
{
    static void Main(string[] args)
    {
        // 1. 리스트 생성
        List<int> myList = new List<int>();

        // 2. 데이터 추가 (Add)
        myList.Add(10);
        myList.Add(20);
        myList.Add(30);

        // 3. 데이터 삽입 (Insert)
        myList.Insert(1, 15); // 인덱스 1에 15 삽입

        // 4. 데이터 삭제 (RemoveAt, Remove)
        myList.RemoveAt(2); // 인덱스 2의 데이터 삭제
        myList.Remove(20); // 값 20을 가진 데이터 삭제

        // 5. 데이터 검색 (Find)
        int value = myList.Find(x => x > 10); // 10보다 큰 첫 번째 값 반환

        // 6. 리스트 순회
        foreach (int value in myList)
        {
            Console.WriteLine("Value: " + value);
        }

        // 7. 리스트 길이
        Console.WriteLine("Count: " + myList.Count);

        // 8. 리스트 비우기
        myList.Clear();
    }
}

실제 활용

// 아이템 클래스 타입의 리스트 선언 및 new
List<Item> _items = new List<Item>();

// 아이템을 추가
_items.Add(new Item("체력 물약", 100));
_items.Add(new Item("강철의 영약", 200));

// 아이템을 검색
Item item = _items.Find(i => i.Name == "체력 물약");

// 아이템을 삭제
_items.Remove(item);


Top