2024. 9. 20. 20:48ㆍData 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> 클래스는 동적으로 크기를 조정할 수 있는 매우 유용한 자료구조입니다.
배열에 비해 유연한 데이터 추가 및 삭제가 가능하며, 다양한 메서드를 통해 데이터를 손쉽게 관리할 수 있습니다.
리스트는 다양한 상황에서 사용될 수 있으며, 데이터의 크기와 형태에 따라 배열이나 리스트 중 적절한 자료구조를 선택할 수 있습니다.
'Data Structure' 카테고리의 다른 글
단일 연결 리스트 (Singly Linked List)의 개념 및 구현 (0) | 2024.11.03 |
---|---|
배열 (Array)의 개념 및 구현 (0) | 2024.10.27 |
메모리와 데이터 저장 방식 (5) | 2024.10.21 |
스택(Stack)의 개념 및 구현 (1) | 2024.09.23 |
자료 구조(Data Structure)의 정의와 중요성 (0) | 2024.08.25 |