프로그래밍/C#

고급 C#에서 컬렉션과 제네릭의 이해와 활용

shimdh 2025. 9. 10. 09:43
728x90

C# 프로그래밍에서 컬렉션과 제네릭은 효율적이고 타입 안전한 애플리케이션을 구축하는 데 필수적인 요소입니다. 이 블로그 포스트에서는 컬렉션과 제네릭의 개념을 깊이 있게 탐구하고, 이를 활용하여 더 나은 소프트웨어를 개발하는 방법을 알아보겠습니다.

컬렉션 이해하기

컬렉션은 .NET에서 제공하는 특수 클래스들로, 관련 객체 그룹을 다루는 데 도움을 줍니다. 이들은 배열이나 리스트를 관리하는 데 수반되는 복잡성을 추상화하면서 향상된 기능을 제공합니다.

728x90

컬렉션의 종류

  1. 배열: 동일한 타입의 요소를 고정 크기로 보유하는 컬렉션입니다.
  2. 리스트: 아이템의 추가/제거가 용이한 동적 크기의 컬렉션입니다.
  3. 딕셔너리: 키-값 쌍을 통해 키 기반의 빠른 조회를 가능하게 합니다.
  4. : 선입선출(FIFO) 방식의 컬렉션으로, 순서대로 작업을 처리하는 데 이상적입니다.
  5. 스택: 후입선출(LIFO) 방식의 컬렉션으로, 백트래킹 시나리오에 사용됩니다.

실용 예제 - 리스트 사용하기

List<string> fruits = new List<string>();
fruits.Add("Apple");
fruits.Add("Banana");
fruits.Remove("Apple");

foreach (var fruit in fruits)
{
    Console.WriteLine(fruit); // 출력은 "Banana"입니다.
}

제네릭

제네릭은 클래스, 인터페이스 및 메서드를 정의할 때 나중에 지정할 수 있는 타입의 자리표시자를 사용하게 해줍니다. 이는 코드 재사용성을 촉진하면서 컴파일 시 타입 안전성을 유지합니다.

제네릭의 이점

  • 타입 안전성: 컴파일 시 타입 불일치를 잡아내어 런타임 오류를 줄입니다.
  • 성능 향상: List<T>와 같은 제네릭 컬렉션을 사용할 때 값 타입의 박싱/언박싱을 제거하여 성능을 개선합니다.

실용 예제 - 제네릭 메서드 생성하기

public T GetFirstItem<T>(List<T> items)
{
    return items.Count > 0 ? items[0] : default(T);
}

// 사용 예
var firstFruit = GetFirstItem(fruits); // "Banana"를 반환합니다.

제네릭 컬렉션

.NET 프레임워크는 System.Collections.Generic 네임스페이스 아래 여러 내장 제네릭 컬렉션 클래스를 제공합니다:

  • List<T>: 각 요소가 강력한 타입을 가지는 동적 크기의 리스트입니다.
  • Dictionary<TKey, TValue>: 키-값 쌍을 저장하는 컬렉션으로, 키와 값 모두 강력한 타입을 가집니다.
  • HashSet<T>: 고유한 요소만을 보장하는 비정렬 컬렉션입니다.

실용 예제 - 딕셔너리 사용하기

Dictionary<int, string> studentGrades = new Dictionary<int, string>();
studentGrades.Add(1, "A");
studentGrades.Add(2, "B");

Console.WriteLine($"Student ID 1 has grade {studentGrades[1]}"); // 출력은 "A"입니다.

커스텀 제네릭 클래스

다양한 데이터 타입에 적용 가능한 동작을 캡슐화하면서 성능이나 안전성을 저해하지 않는 커스텀 제네릭 클래스를 만들 수 있습니다.

실용 예제 - 커스텀 제네릭 클래스

public class Box<T>
{
    private T item;

    public void Pack(T itemToPack)
    {
        item = itemToPack;
    }

    public T Unpack()
    {
        return item;
    }
}

// 사용 예
Box<int> intBox = new Box<int>();
intBox.Pack(123);
Console.WriteLine(intBox.Unpack()); // 123을 출력합니다.

결론

결론적으로, 컬렉션과 제네릭을 통한 고급 데이터 구조의 숙달은 C#에서 깨끗하고 효율적인 코드를 작성하는 능력을 향상시킵니다. 동적 리스트나 커스텀 제네릭 클래스와 같은 강력한 도구를 활용함으로써 복잡한 데이터 조작을 원활하게 처리할 수 있는 확장 가능한 애플리케이션을 구축할 수 있습니다. 이러한 구성 요소들이 어떻게 상호작용하는지를 이해하면 C# 생태계 내에서 소프트웨어 설계 능력이 크게 향상될 것입니다.

728x90