제네릭(Generics)은 어떤 데이터 타입으로도 동작할 수 있는 클래스나 메서드를 작성할 수 있게 해주는 C#의 강력한 기능입니다.
제네릭을 사용하면 클래스나 메서드를 정의할 때 구체적인 데이터 타입 대신 타입 매개변수(type parameter)를 지정합니다. 그러면 컴파일러가 해당 클래스의 생성자나 메서드 호출을 만나는 시점에, 실제 사용되는 특정 데이터 타입에 맞는 코드를 자동으로 생성해 줍니다.
제네릭이 주는 이점
제네릭은 다음과 같은 방식으로 프로그램의 품질을 한층 끌어올려 줍니다.
코드 재사용성, 타입 안전성, 성능 극대화 — 하나의 코드로 여러 타입을 처리하면서도 형 변환 오류와 박싱(boxing) 오버헤드를 줄일 수 있습니다.
제네릭 컬렉션 클래스 활용 — .NET Framework 클래스 라이브러리는
System.Collections.Generic네임스페이스에 다양한 제네릭 컬렉션 클래스(List<T>,Dictionary<TKey, TValue>등)를 제공합니다. 기존의System.Collections네임스페이스의 컬렉션보다 타입 안전성과 성능 면에서 유리하므로, 가능하면 제네릭 버전을 사용하는 것이 좋습니다.자신만의 제네릭 요소 작성 — 제네릭 인터페이스, 클래스, 메서드, 이벤트, 델리게이트를 직접 만들어 필요에 맞게 확장할 수 있습니다.
제약 조건(constraints) 적용 — 제네릭 클래스에 제약 조건을 걸어 특정 데이터 타입의 메서드에 접근할 수 있도록 설정할 수 있습니다. 예를 들어
where T : SomeClass처럼 지정하면 해당 타입의 멤버를 안전하게 사용할 수 있습니다.런타임 타입 정보 조회 — 리플렉션(reflection)을 통해 제네릭 데이터 타입에 사용된 실제 타입 정보를 실행 중에 확인할 수 있습니다.
간단한 예시
public class Box<T>
{
public T Value { get; set; }
}
var intBox = new Box<int> { Value = 10 };
var strBox = new Box<string> { Value = "Hello" };
위 예시처럼 하나의 Box<T> 클래스만 정의하면, int, string 등 어떤 타입이든 담을 수 있는 클래스를 별도로 작성하지 않고도 사용할 수 있습니다. 이것이 바로 제네릭이 제공하는 핵심 가치입니다.