프로그래밍/C#

C#에서 컬렉션과 제네릭의 강력한 조합

shimdh 2025. 8. 27. 09:26
728x90

C# 프로그래밍에서 컬렉션과 제네릭은 데이터 관리의 유연성과 효율성을 극대화하는 데 필수적인 요소입니다. 이 블로그 포스트에서는 컬렉션의 다양한 종류와 제네릭의 이점을 살펴보고, 이를 통해 어떻게 더 나은 코드를 작성할 수 있는지 알아보겠습니다.

컬렉션의 필요성

왜 컬렉션을 사용해야 할까요?

  1. 동적 크기 조정: 배열은 고정 크기이지만, 컬렉션은 필요에 따라 크기를 조정할 수 있습니다.
  2. 타입 안전성: 제네릭을 사용하면 컴파일 시 타입 검사를 통해 런타임 오류를 줄일 수 있습니다.
  3. 편리한 메서드: 컬렉션은 데이터 검색, 정렬 및 조작을 단순화하는 메서드를 제공합니다.

C#의 주요 컬렉션 종류

리스트

  • 특징: 중복 요소를 허용하는 순서가 있는 컬렉션.

  • 예제:

    List<string> names = new List<string>();
    names.Add("Alice");
    names.Add("Bob");
    names.Add("Charlie");
    
    foreach (var name in names)
    {
        Console.WriteLine(name);
    }

딕셔너리

  • 특징: 고유한 키-값 쌍을 저장.

  • 예제:

    Dictionary<int, string> students = new Dictionary<int, string>();
    students.Add(1, "Alice");
    students.Add(2, "Bob");
    
    Console.WriteLine(students[1]); // 출력: Alice

해시셋

  • 특징: 중복을 허용하지 않는 비순서 컬렉션.

  • 예제:

    HashSet<string> uniqueNames = new HashSet<string>();
    uniqueNames.Add("Alice");
    uniqueNames.Add("Bob");
    uniqueNames.Add("Alice"); // 다시 추가되지 않음
    
    foreach (var name in uniqueNames)
    {
        Console.WriteLine(name); // Alice와 Bob만 각각 한 번씩 출력
    }

  • 특징: 선입선출(FIFO) 컬렉션.

  • 예제:

    Queue<string> queue = new Queue<string>();
    queue.Enqueue("First");
    queue.Enqueue("Second");
    
    Console.WriteLine(queue.Dequeue()); // 출력: First

스택

  • 특징: 후입선출(LIFO) 컬렉션.

  • 예제:

    Stack<int> stack = new Stack<int>();
    stack.Push(1);
    stack.Push(2);
    
    Console.WriteLine(stack.Pop()); // 출력: 2

제네릭의 이해

제네릭은 타입 안전성과 성능을 유지하면서 재사용 가능한 코드를 작성할 수 있게 해줍니다.

제네릭 클래스 예제

public class Box<T>
{
    private T item;

    public void Pack(T item)
    {
        this.item = item;
    }

    public T Unpack()
    {
        return item;
    }
}

var boxOfInt = new Box<int>();
boxOfInt.Pack(123);
int number = boxOfInt.Unpack(); // number는 123이 됩니다.

var boxOfString = new Box<string>();
boxOfString.Pack("Hello World!");
string message = boxOfString.Unpack(); // message는 "Hello World!"가 됩니다.

컬렉션에서 제네릭 사용의 이점

  • 성능 향상: 비제네릭 컬렉션의 박싱/언박싱 오버헤드를 피할 수 있습니다.
  • 코드 재사용성: 특정 데이터 유형에 대해 여러 버전을 만들 필요 없이 모든 데이터 유형에 대해 작동하는 코드를 작성할 수 있습니다.

결론

컬렉션과 제네릭을 결합하면 C#에서 강력한 기반을 형성합니다. 이러한 개념이 함께 작동하는 방식을 이해하면 개발자가 효율적이고 유지 관리가 용이한 애플리케이션을 구축할 수 있으며, 제네릭이 제공하는 강력한 타입 메커니즘을 통해 높은 성능을 보장할 수 있습니다. 중급 C#을 계속 배우면서, 컬렉션과 제네릭을 마스터하면 프로그래밍 기술이 크게 향상될 것입니다!

728x90