본문 바로가기

C#

C# 제네릭 (Generics) 기초

1. 개념 설명

제네릭은 클래스·인터페이스·메서드에 형식 매개변수 T를 도입해 재사용성과 타입 안전성을 높이는 기능입니다. 하나의 구현으로 여러 타입을 지원하면서 캐스팅을 줄이고 박싱/언박싱을 피해 성능 이점을 얻습니다. .NET의 List<T>, Dictionary<TKey,TValue>가 대표적 예이며, 컴파일 타임에 오류를 조기에 발견할 수 있습니다.

2. 코드 예제

아래 예제는 제네릭 클래스 Box<T>, 제네릭 메서드 PrintAll<T>, 그리고 제약조건 where T : IComparable<T>로 두 값의 최댓값을 구합니다. 콘솔에 박스 값, 문자열 목록, 각 타입의 최댓값을 출력합니다.

using System;
using System.Collections.Generic;

class Box<T>
{
    private T _value;
    public void Set(T value) => _value = value;
    public T Get() => _value;
}

class Program
{
    static void PrintAll<T>(IEnumerable<T> items)
    {
        foreach (var item in items)
            Console.WriteLine(item);
    }

    static T MaxOfTwo<T>(T a, T b) where T : IComparable<T>
        => a.CompareTo(b) >= 0 ? a : b;

    static void Main()
    {
        var intBox = new Box<int>();
        intBox.Set(42);
        Console.WriteLine($"Box<int>: {intBox.Get()}");

        var words = new List<string> { "apple", "banana", "cherry" };
        Console.WriteLine("PrintAll<string>:");
        PrintAll(words);

        Console.WriteLine($"Max int: {MaxOfTwo(3, 5)}");
        Console.WriteLine($"Max string: {MaxOfTwo("alpha", "beta")}");
    }
}

형식 유추로 PrintAllMaxOfTwoT는 자동 결정되며, 제약조건 덕분에 비교 가능한 타입만 컴파일됩니다.

3. 주의사항/팁

제약조건을 적극 사용하세요: where T : struct/class, new(), IComparable<T>, notnull 등으로 사용 범위를 명확히 하면 오류를 줄입니다. 값 형식은 제네릭 컬렉션에서 박싱을 피하므로 List<int>처럼 구체 타입을 그대로 쓰는 것이 유리합니다. 또한 반환/매개변수에 인터페이스를 사용하고, 델리게이트·인터페이스에서만 지원되는 in/out 공변/반공변 개념을 기억하세요.

'C#' 카테고리의 다른 글

C# 확장 메서드  (0) 2026.04.01
C# 델리게이트와 이벤트  (0) 2026.03.31
C# Nullable 참조 타입  (0) 2026.03.30
C# 레코드 타입 (Record)  (0) 2026.03.27
C# 패턴 매칭 (Pattern Matching)  (0) 2026.03.26