C# 제네릭 메서드란 무엇인가?
제네릭(Generics)은 하나의 클래스나 메서드가 특정 데이터 타입에 얽매이지 않고 다양한 타입과 함께 동작하도록 작성할 수 있게 해주는 C#의 핵심 기능입니다. 제네릭을 활용하면 코드 중복을 줄이고, 컴파일 시점에 타입 안정성을 확보하며, 박싱(boxing)으로 인한 성능 저하도 피할 수 있습니다.
제네릭 메서드는 메서드 이름 뒤에 꺾쇠 괄호(<>)로 감싼 타입 매개변수(type parameter)를 선언하여 정의합니다. 아래는 두 변수의 값을 서로 교환하는 제네릭 Swap 메서드의 기본 형태입니다.
static void Swap<T>(ref T lhs, ref T rhs) { }
정의된 제네릭 메서드를 호출할 때는 사용할 구체적인 타입을 명시적으로 지정할 수도 있고, 인자로 전달되는 값의 타입을 컴파일러가 자동으로 추론하게 할 수도 있습니다.
Swap<int>(ref a, ref b);
C# 제네릭 메서드 작성 예제
다음 예제는 하나의 제네릭 Swap<T> 메서드를 int형과 char형 변수에 모두 적용하는 모습을 보여줍니다. 동일한 메서드가 여러 타입에서 문제없이 동작한다는 점이 제네릭의 가장 큰 장점입니다.
using System;
using System.Collections.Generic;
namespace Demo {
class Program {
static void Swap<T>(ref T lhs, ref T rhs) {
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
static void Main(string[] args) {
int a, b;
char c, d;
a = 45;
b = 60;
c = 'K';
d = 'P';
Console.WriteLine("Int values before calling swap:");
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.WriteLine("Char values before calling swap:");
Console.WriteLine("c = {0}, d = {1}", c, d);
Swap(ref a, ref b);
Swap(ref c, ref d);
Console.WriteLine("Int values after calling swap:");
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.WriteLine("Char values after calling swap:");
Console.WriteLine("c = {0}, d = {1}", c, d);
Console.ReadKey();
}
}
}
실행 결과
Int values before calling swap: a = 45, b = 60 Char values before calling swap: c = K, d = P Int values after calling swap: a = 60, b = 45 Char values after calling swap: c = P, d = K
제네릭 메서드의 주요 장점
- 코드 재사용성: 타입별로 메서드를 중복 작성할 필요가 없어 유지보수가 쉬워집니다.
- 타입 안정성: 잘못된 타입이 전달되면 컴파일 단계에서 오류를 바로 확인할 수 있습니다.
- 성능 향상: object로의 변환 과정에서 발생하는 박싱/언박싱 비용을 줄일 수 있습니다.