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")}");
}
}
형식 유추로 PrintAll과 MaxOfTwo의 T는 자동 결정되며, 제약조건 덕분에 비교 가능한 타입만 컴파일됩니다.
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 |