IMCAT.DEV
로그인 가입
C# 중급 자료구조

C# 컬렉션(Generic Collections)

C# 컬렉션(Generic Collections) — 중급

컬렉션(Generic Collections)

1. 도입 (왜 배워야 하는가)

C#에서 컬렉션은 데이터를 관리하고 조작하는 데 필수적인 도구입니다. 특히, Generic Collections는 타입 안전성을 제공하여, runtime에서 발생할 수 있는 오류를 compile-time에서 미리 방지할 수 있습니다. 실무에서는 데이터베이스에서 가져온 데이터나 사용자 입력을 처리할 때, 이 컬렉션을 통해 효율적으로 데이터를 저장하고 조작할 수 있습니다.

이러한 컬렉션을 사용하지 않으면, 일반적인 배열처럼 고정된 크기를 가지게 되어 동적으로 변할 수 있는 데이터에 대한 유연성이 떨어지게 됩니다. 예를 들어, 쇼핑몰의 장바구니를 구현할 때, 사용자가 여러 가지 상품을 추가하고 삭제할 수 있어야 하는데, 고정 배열을 사용할 경우 이러한 상황을 처리하기 어렵습니다.

2. 핵심 개념 설명

컬렉션은 데이터를 그룹화하여 관리하는 방법을 제공합니다. Generic Collections는 특정 데이터 타입을 지정하여, 코드의 안전성과 가독성을 높여줍니다. 여기서는 몇 가지 주요 컬렉션에 대해 설명하겠습니다.

컬렉션 종류설명비유
List<T>동적으로 크기가 변하는 배열장바구니에 물건을 추가하는 것
Dictionary<TKey, TValue>키와 값으로 구성된 데이터 저장전화번호부
HashSet<T>중복된 값을 허용하지 않는 집합친구 목록

3. 기본 코드 예제

List<T>의 사용법

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<string> shoppingList = new List<string>(); // 빈 List<string> 생성
        shoppingList.Add("사과"); // 사과 추가
        shoppingList.Add("바나나"); // 바나나 추가
        shoppingList.Add("오렌지"); // 오렌지 추가

        foreach (var item in shoppingList) // 리스트에 있는 모든 아이템을 출력
        {
            Console.WriteLine(item);
        }
    }
}

실행 결과:

사과
바나나
오렌지
  • List<string> shoppingList = new List<string>(); : 문자열 타입의 빈 리스트를 생성합니다.
  • shoppingList.Add("사과"); : 리스트에 "사과"를 추가합니다.
  • foreach (var item in shoppingList) : 리스트의 모든 아이템을 반복합니다.
  • Console.WriteLine(item); : 각 아이템을 콘솔에 출력합니다.
  • 4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니 구현

    쇼핑몰에서 사용자가 물건을 추가하고 삭제할 수 있는 장바구니를 구현할 때, List<T>를 사용합니다.

    using System;
    using System.Collections.Generic;
    
    class ShoppingCart
    {
        private List<string> items = new List<string>();
    
        public void AddItem(string item)
        {
            items.Add(item);
            Console.WriteLine($"{item}이(가) 장바구니에 추가되었습니다.");
        }
    
        public void RemoveItem(string item)
        {
            if (items.Remove(item))
            {
                Console.WriteLine($"{item}이(가) 장바구니에서 제거되었습니다.");
            }
            else
            {
                Console.WriteLine($"{item}은(는) 장바구니에 없습니다.");
            }
        }
    
        public void ShowItems()
        {
            Console.WriteLine("장바구니에 담긴 물품:");
            foreach (var item in items)
            {
                Console.WriteLine(item);
            }
        }
    }

    이렇게 구현된 장바구니를 통해 사용자는 원하는 물품을 추가하거나 삭제할 수 있습니다.

    예제 2: 전화번호부 구현

    Dictionary<TKey, TValue>를 사용하여 전화번호부를 구현할 수 있습니다.

    using System;
    using System.Collections.Generic;
    
    class PhoneBook
    {
        private Dictionary<string, string> phoneBook = new Dictionary<string, string>();
    
        public void AddContact(string name, string phoneNumber)
        {
            phoneBook[name] = phoneNumber;
            Console.WriteLine($"{name}이(가) 전화번호부에 추가되었습니다.");
        }
    
        public void ShowContact(string name)
        {
            if (phoneBook.TryGetValue(name, out string phoneNumber))
            {
                Console.WriteLine($"{name}의 전화번호는 {phoneNumber}입니다.");
            }
            else
            {
                Console.WriteLine($"{name}은(는) 전화번호부에 없습니다.");
            }
        }
    }

    5. 흔한 실수와 주의사항

    1. 잘못된 타입 사용:
    2. - 잘못된 타입을 List에 추가하면 컴파일 오류가 발생합니다.

         List<int> numbers = new List<int>();
         // numbers.Add("문자열"); // 오류 발생
    3. NullReferenceException:
    4. - 컬렉션이 비어 있는 상태에서 아이템을 제거하려고 하면 예외가 발생할 수 있습니다.

         List<string> items = new List<string>();
         // items.Remove("사과"); // 오류 발생

      6. 정리

    5. Generic Collections는 데이터 처리의 안전성과 유연성을 제공합니다.
    6. List<T>는 동적으로 크기가 변하는 배열로 자주 사용됩니다.
    7. Dictionary<TKey, TValue>는 키-값 쌍으로 데이터를 저장하는 데 유용합니다.
    8. HashSet<T>는 중복된 값을 허용하지 않아 데이터의 유일성을 보장합니다.
    9. 다음에 학습하면 좋은 주제로는 LINQ(데이터 쿼리)와 비동기 프로그래밍을 추천합니다.