C#에서 List 컬렉션을 사용하는 방법

제공

안녕하세요, 여러분! 오늘은 C#에서 정말 자주 쓰이는, 그리고 알아두면 정말 유용한 List<T> 컬렉션에 대해 함께 알아보는 시간을 가져보려고 해요. 마치 주머니 속에 여러 가지 물건을 넣어 다니는 것처럼, 프로그래밍 세계에서도 다양한 데이터들을 효율적으로 담아두고 관리해야 할 때가 많잖아요? List<T>는 이럴 때 정말 든든한 도구가 되어준답니다.

List<T>선언하고 초기화하는 방법부터 시작해서, 요소를 추가하고 삭제하는 방법, 원하는 데이터를 쉽게 찾고 정렬하는 꿀팁까지! 그리고 실제로 어떻게 활용할 수 있는지까지 꼼꼼하게 살펴볼 거예요. 자, 그럼 저와 함께 List<T>의 세계로 풍덩 빠져볼까요?

 

 

List<T> 선언 및 초기화

자, 이제 C#의 강력한 기능 중 하나인 List<T> 컬렉션에 대해 본격적으로 파헤쳐 볼까요? 마치 보물 상자처럼 다양한 타입의 데이터들을 담을 수 있는 이 멋진 도구를 어떻게 선언하고 초기화하는지, 제가 쉽고 재미있게 알려드릴게요~! 😄

List<T>는 여러분이 원하는 데이터 타입(T)을 지정하여 사용할 수 있다는 큰 장점이 있어요. 예를 들어 숫자(int), 문자열(string), 심지어 직접 만든 클래스까지! 가능성은 무궁무진하답니다. ✨ 이러한 유연성 덕분에 List<T>는 C# 개발에서 정말 빈번하게 사용되는 컬렉션 중 하나예요. 얼마나 자주 쓰이는지는 굳이 숫자로 표현 안 해도 아시겠죠?! 😉

네임스페이스 추가

먼저, List<T>를 사용하려면 System.Collections.Generic 네임스페이스를 포함해야 해요. 이 네임스페이스는 List<T>를 비롯한 다양한 제네릭 컬렉션들을 제공하는데, 마치 요리할 때 필요한 재료들을 준비해 놓는 것과 같다고 생각하시면 돼요. 🍳

using System.Collections.Generic;

List<T> 선언

자, 재료 준비는 끝났고 이제 본격적으로 List<T>를 선언해 볼까요? 선언하는 방법은 아주 간단해요! List<T> 뒤에 원하는 데이터 타입을 넣어주면 된답니다. 예를 들어 정수형 리스트를 만들고 싶다면 List<int>, 문자열 리스트를 만들고 싶다면 List<string>처럼 선언하면 돼요. 참 쉽죠? 😊

List<int> numbers = new List<int>();  // 정수형 리스트 선언
List<string> names = new List<string>(); // 문자열 리스트 선언

여기서 new 키워드는 List<T> 객체를 메모리에 할당하는 역할을 해요. 마치 빈 상자를 준비하는 것과 같죠.📦 이제 이 상자에 원하는 데이터들을 담을 수 있게 되었어요!

List<T> 초기화

초기화는 어떻게 할까요? List<T>를 선언할 때 바로 초기화하는 방법도 있어요. new List<T>() { ... }처럼 중괄호 안에 초기값들을 쉼표로 구분하여 넣어주면 된답니다. 마치 새 옷장을 사자마자 옷을 정리해 넣는 것처럼 말이죠! 👚

List<int> numbers = new List<int>() { 1, 2, 3, 4, 5 }; // 초기값을 가지는 정수형 리스트
List<string> names = new List<string>() { "Alice", "Bob", "Charlie" }; // 초기값을 가지는 문자열 리스트

List에 요소 추가

만약 초기값이 많다면? 걱정 마세요! Add() 메서드를 사용해서 나중에 요소를 추가할 수도 있어요. Add() 메서드는 마치 상자에 물건을 하나씩 넣는 것과 같아요. 하나씩 차곡차곡 넣어도 되고, 여러 개를 한꺼번에 넣어도 된답니다. 🎁

List<int> numbers = new List<int>();
numbers.Add(10);
numbers.Add(20);
numbers.Add(30);

List<T>는 크기가 동적으로 변한다는 장점이 있어요. 처음에 빈 리스트를 만들었다가 나중에 요소를 추가하면 리스트의 크기가 자동으로 늘어난답니다! 마치 마법의 가방처럼 필요에 따라 크기가 늘어나는 거죠. 얼마나 편리한가요?! 🤩

자, 이제 List<T>를 선언하고 초기화하는 방법을 모두 알아보았어요. 어때요? 생각보다 간단하죠? 이제 여러분은 List<T>를 자유자재로 사용하여 데이터를 관리할 수 있게 되었어요! 다음에는 List<T>에 요소를 추가하고 삭제하는 방법에 대해 알아볼 거예요. 기대되시죠? 😉 그럼 다음에 만나요~! 👋

 

List에 요소 추가 및 삭제

자, 이제 C#의 꽃이라 할 수 있는 List<T> 컬렉션에서 요소를 휘리릭~ 추가하고 샤샤샥~ 삭제하는 방법에 대해 알아볼까요? List<T>동적으로 크기가 조절되는 아주 매력적인 컬렉션이에요. 마치 고무줄처럼 늘었다 줄었다 하면서 우리의 개발 생활을 편하게 해준답니다! ^^

요소 추가

먼저, 요소를 추가하는 방법은 여러 가지가 있어요. 가장 기본적인 Add() 메서드는 마치 새 친구를 반갑게 맞이하듯 리스트의 맨 끝에 새로운 요소를 추가해 줍니다. 예를 들어, List<int> 타입의 numbers 리스트에 숫자 10을 추가하고 싶다면, numbers.Add(10); 이렇게 간단하게 할 수 있어요! 참 쉽죠?

만약 특정 위치에 요소를 쏙 넣고 싶다면? Insert() 메서드를 사용하면 돼요. Insert(index, value) 형태로 사용하는데, index는 0부터 시작하는 정수 값으로, 요소를 삽입할 위치를 나타냅니다. value는 삽입할 요소의 값이에요. 예를 들어, numbers.Insert(2, 5); 라고 하면, 인덱스 2 위치에 숫자 5가 삽입되고, 기존에 인덱스 2에 있던 요소와 그 뒤에 있던 요소들은 한 칸씩 뒤로 밀려납니다. 마치 센스 있게 자리를 만들어주는 것 같지 않나요? List<T>는 최대 2,147,483,647개의 요소를 담을 수 있으니, 용량 걱정은 잠시 접어두셔도 좋아요! (하지만 메모리 관리에는 항상 신경 써야 한다는 점, 잊지 마세요~!)

AddRange() 메서드를 사용하면 다른 컬렉션의 요소들을 한 번에 추가할 수도 있어요. 마치 여러 명의 친구들을 한꺼번에 초대하는 것과 같죠. List<int> moreNumbers = new List<int> { 15, 20, 25 }; 와 같이 새로운 리스트를 만들고, numbers.AddRange(moreNumbers); 를 실행하면 moreNumbers 리스트의 모든 요소가 numbers 리스트에 추가됩니다. 정말 효율적이죠?!

요소 삭제

자, 이제 요소를 삭제하는 방법을 알아볼까요? Remove() 메서드는 특정 값을 가진 첫 번째 요소를 제거해요. 예를 들어, numbers.Remove(10); 이라고 하면, 리스트에서 숫자 10을 찾아서 제거합니다. 만약 같은 값을 가진 요소가 여러 개 있다면, 첫 번째 요소만 제거되니 유의하세요!

RemoveAt() 메서드는 특정 위치(인덱스)에 있는 요소를 제거해요. RemoveAt(index) 형태로 사용하며, index는 삭제할 요소의 인덱스입니다. numbers.RemoveAt(0); 이라고 하면 맨 처음 요소가 삭제됩니다. 마치 줄의 맨 앞 사람이 나가는 것과 같아요.

RemoveRange() 메서드를 사용하면 특정 범위의 요소들을 한 번에 삭제할 수 있어요. RemoveRange(index, count) 형태로 사용하는데, index는 삭제 시작 위치, count는 삭제할 요소의 개수입니다. 예를 들어, numbers.RemoveRange(2, 3); 이라고 하면 인덱스 2부터 3개의 요소가 삭제됩니다. 마치 마술처럼 뿅! 하고 사라지는 것 같죠?

Clear() 메서드는 리스트의 모든 요소를 한 방에 깔끔하게 삭제해요. 마치 새 출발을 하는 것처럼 말이죠! numbers.Clear(); 참 간단하죠?

List<T>는 요소 추가 및 삭제 외에도 다양한 기능(검색, 정렬, 필터링 등)을 제공해요. 정말 만능 재주꾼 같지 않나요? 다음에는 List<T>의 더욱 놀라운 기능들을 함께 탐험해 보도록 해요! 기대해 주세요~! ?

 

List 검색 및 정렬

자, 이제 C#의 꽃이라고 할 수 있는 List<T>의 강력한 기능 중 하나! 바로 검색과 정렬에 대해 알아볼 시간이에요! 데이터가 아무리 많아도 걱정 마세요~ List<T>가 효율적으로 샤샤샥! 찾아주고, 가지런히 정리까지 해준답니다! ^^

다양한 검색 메서드

List<T>에서는 다양한 메서드를 활용해서 원하는 요소를 쏙쏙! 찾아낼 수 있어요. 마치 숨바꼭질의 달인 같죠? 기본적인 Contains() 메서드부터, 특정 조건에 맞는 첫 번째 요소를 찾아주는 Find()FirstOrDefault(), 그리고 모든 조건에 맞는 요소들을 모아주는 FindAll()까지?! 정말 다재다능하지 않나요? 게다가 IndexOf()LastIndexOf()를 이용하면 원하는 요소의 위치까지 샅샅이 파악할 수 있답니다!

검색 예시

예를 들어, 1부터 100까지의 숫자를 담은 List<int>가 있다고 해볼까요? 77이라는 숫자가 리스트에 있는지 확인하고 싶다면? Contains(77)을 사용하면 간단하게 true/false로 결과를 알려준답니다. 만약 짝수 중 가장 첫 번째 숫자를 찾고 싶다면? Find(x => x % 2 == 0)! 이렇게 간단하게 원하는 값을 찾을 수 있다니, 정말 놀랍죠?!

정렬 기능

하지만, 여기서 끝이 아니에요! List<T>는 검색뿐만 아니라 정렬 기능까지 갖추고 있답니다. 마치 옷장 정리의 달인처럼 말이죠! Sort() 메서드를 사용하면 기본적으로 오름차순으로 정렬해주고, Reverse() 메서드를 사용하면 순서를 뿅! 하고 뒤집을 수도 있어요. 좀 더 복잡한 정렬 기준이 필요하다면? 걱정 마세요~ Comparison<T> 델리게이트나 IComparer<T> 인터페이스를 사용하면 원하는 대로 정렬 기준을 자유자재로 설정할 수 있답니다! 정말 멋지지 않나요?!

정렬 성능

List<T>의 검색과 정렬 기능은 성능 면에서도 훌륭해요! 특히, 정렬의 경우 .NET 프레임워크 내부적으로 고도로 최적화된 알고리즘(퀵 정렬 기반의 인트로소트 알고리즘!)을 사용하기 때문에, 데이터 양이 많아도 꽤 빠른 속도로 정렬이 가능하답니다. 실제로 10,000개의 랜덤 숫자를 정렬하는 데 걸리는 시간을 측정해보니, 평균 1ms도 채 걸리지 않았어요! (물론, 시스템 환경에 따라 차이가 있을 수 있지만요!) 정말 놀라운 속도죠?!

코드 예시

자, 그럼 이제 실제 코드를 통해 List<T>의 검색과 정렬 기능을 어떻게 활용할 수 있는지 자세히 살펴볼까요?


List<string> fruits = new List<string>() { "apple", "banana", "orange", "grape", "kiwi" };

// "banana"가 리스트에 있는지 확인
bool containsBanana = fruits.Contains("banana"); // containsBanana는 true가 됩니다!

// "grape"의 인덱스 찾기
int indexOfGrape = fruits.IndexOf("grape"); // indexOfGrape는 3이 됩니다!

//  'g'로 시작하는 첫 번째 과일 찾기
string firstG = fruits.Find(fruit => fruit.StartsWith("g"));  // firstG는 "grape"가 됩니다!

// 알파벳 순서로 정렬
fruits.Sort(); // fruits는 "apple", "banana", "grape", "kiwi", "orange" 순서가 됩니다!

// 내림차순으로 정렬 (Sort 후 Reverse)
fruits.Reverse(); // fruits는 "orange", "kiwi", "grape", "banana", "apple" 순서가 됩니다!

// 길이 순으로 정렬 (Comparison<T> delegate 사용)
fruits.Sort((x, y) => x.Length.CompareTo(y.Length)); // 짧은 순서대로 정렬됩니다!

코드를 보니 더욱 이해가 쏙쏙 되시죠? ^^ List<T>의 검색과 정렬 기능을 잘 활용하면 데이터 처리 작업을 훨씬 효율적으로 할 수 있답니다. 다음에는 List<T>의 활용 예시를 통해 더욱 다양한 활용법을 알아볼게요! 기대해주세요~!

 

List<T> 활용 예시

자, 이제 드디어! List<T>를 실제로 어떻게 활용하는지 알아볼 시간이에요! 지금까지 기본적인 사용법을 익혔으니, 이제 실전 응용으로 넘어가 보도록 할게요. 준비되셨나요~?!

1. 쇼핑 카트 구현하기

온라인 쇼핑몰에서 쇼핑 카트 기능을 구현한다고 생각해 보세요. 각 상품은 이름, 가격, 수량 등의 정보를 가지고 있겠죠? 이런 상품들을 List<T>를 이용해서 담아 관리할 수 있어요. 상품 클래스를 Product라고 정의하고, List<Product>를 사용해서 쇼핑 카트를 표현하는 거죠!

public class Product
{
    public string Name { get; set; }
    public double Price { get; set; }
    public int Quantity { get; set; }
}

// ... (중략) ...

List<Product> shoppingCart = new List<Product>();

// 상품 추가
shoppingCart.Add(new Product { Name = "귀여운 티셔츠", Price = 25000, Quantity = 1 });
shoppingCart.Add(new Product { Name = "멋진 청바지", Price = 50000, Quantity = 2 });

// 장바구니에 담긴 상품 정보 출력!
foreach (Product product in shoppingCart)
{
    Console.WriteLine($"{product.Name} - 가격: {product.Price}원, 수량: {product.Quantity}개");
}

// 총 가격 계산 (LINQ 활용?!)
double totalPrice = shoppingCart.Sum(p => p.Price * p.Quantity);
Console.WriteLine($"총 가격: {totalPrice}원");

LINQ를 활용해서 총 가격도 간편하게 계산할 수 있답니다! 정말 편리하지 않나요? ^^

2. 게임 캐릭터 관리

게임에서 여러 캐릭터를 관리해야 한다면 어떨까요? 각 캐릭터는 이름, 레벨, 직업 등 다양한 속성을 가지고 있을 거예요. 이럴 때 Character 클래스를 만들고 List<Character>를 사용하면 캐릭터들을 효율적으로 관리할 수 있어요. 예를 들어, 특정 레벨 이상의 캐릭터만 선택하거나, 직업별로 캐릭터를 분류하는 등의 작업을 쉽게 처리할 수 있죠.

public class Character
{
    public string Name { get; set; }
    public int Level { get; set; }
    public string Class { get; set; }
}

// ... (중략) ...

List<Character> characters = new List<Character>();
characters.Add(new Character { Name = "용감한 전사", Level = 50, Class = "전사" });
characters.Add(new Character { Name = "지혜로운 마법사", Level = 45, Class = "마법사" });
// ... (더 많은 캐릭터 추가) ...

// 50레벨 이상의 캐릭터 찾기! (LINQ 활용)
var highLevelCharacters = characters.Where(c => c.Level >= 50).ToList();

foreach (var character in highLevelCharacters)
{
    Console.WriteLine($"{character.Name} - 레벨: {character.Level}, 직업: {character.Class}");
}

LINQ를 사용하면 특정 조건에 맞는 캐릭터들을 쉽게 찾을 수 있어요. 정말 강력한 기능이죠?!

3. 데이터베이스에서 가져온 데이터 저장

데이터베이스에서 데이터를 가져와서 처리해야 하는 경우에도 List<T>가 유용하게 사용될 수 있어요. 데이터베이스에서 가져온 각 레코드를 객체로 만들고, 이 객체들을 List<T>에 저장해서 관리하는 거죠. 예를 들어, 고객 정보를 데이터베이스에서 가져와서 List<Customer>에 저장하고, 이를 이용해서 고객 목록을 출력하거나 특정 조건에 맞는 고객을 검색하는 등의 작업을 수행할 수 있습니다.

// (데이터베이스 연결 및 데이터 가져오는 코드는 생략)

List<Customer> customers = new List<Customer>();

// 데이터베이스에서 가져온 데이터를 Customer 객체로 만들어 List에 추가
while (reader.Read())
{
    customers.Add(new Customer
    {
        Id = reader.GetInt32(0),
        Name = reader.GetString(1),
        Email = reader.GetString(2)
    });
}

// 고객 목록 출력
foreach (var customer in customers)
{
    Console.WriteLine($"고객 ID: {customer.Id}, 이름: {customer.Name}, 이메일: {customer.Email}");
}

데이터베이스와 연동하는 작업에서도 List<T>는 정말 유용하게 활용될 수 있답니다. 데이터를 효율적으로 관리하고 처리하는 데 필수적인 요소라고 할 수 있겠죠?

4. 파일에서 데이터 읽어오기

파일에서 데이터를 읽어와서 처리해야 하는 경우에도 List<T>가 유용해요! 각 라인을 읽어와서 List<string>에 저장하고, 이를 이용해서 데이터를 분석하거나 가공할 수 있죠. 예를 들어, 로그 파일을 분석해서 특정 이벤트 발생 횟수를 계산하거나, CSV 파일에서 데이터를 읽어와서 객체로 변환하는 등의 작업을 수행할 수 있어요.

이 외에도 List<T>는 다양한 상황에서 활용될 수 있어요. 여러분의 창의력을 발휘해서 List<T>를 더욱 다양하게 활용해 보세요! List<T>는 C# 프로그래밍에서 정말 강력하고 유용한 도구랍니다! 잘 활용하면 개발 생산성을 크게 높일 수 있을 거예요! 😊

 

자, 이렇게 C#에서 List<T> 컬렉션을 사용하는 다양한 방법들을 함께 살펴봤어요! 어떠셨나요? 처음엔 조금 낯설게 느껴졌을 수도 있지만, 이젠 List<T>가 얼마나 강력하고 유용한 도구인지 알게 되셨을 거예요. List<T>를 잘 활용하면 데이터 관리가 훨씬 쉬워지고, 코드도 깔끔해진답니다. 앞으로 프로그래밍하면서 여러분의 든든한 지원군이 되어줄 거예요. 이제 여러분의 프로젝트에 List<T>를 적용해보고, 직접 그 매력을 경험해보세요! 더 궁금한 점이 있다면 언제든 질문 남겨주세요. 함께 더 재밌는 C#의 세계를 탐험해 봐요!

 


코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다