제네릭(Generics)은 클래스의 필드, 메서드, 매개변수 등의 타입을 자리 표시자(placeholder)로 정의할 수 있게 해주는 기능입니다. 컴파일 시점에 이 자리 표시자들이 실제 구체적인 타입으로 대체되며, 제네릭은 꺾쇠 괄호 <>를 사용해 선언합니다.
컬렉션의 가장 큰 한계 중 하나는 효과적인 타입 검사가 불가능하다는 점입니다. C#의 모든 클래스는 object 기본 클래스를 상속하기 때문에, 컬렉션에는 어떤 타입의 객체든 자유롭게 담을 수 있습니다.
또한 일반 메서드와 달리 제네릭 메서드에서는 단순히 null을 반환할 수 없습니다. 아래 코드처럼 제네릭 메서드에서 null을 반환하려고 하면 컴파일 오류가 발생합니다.
using System;
namespace DemoApplication {
class Program {
public static void Main() {
Add(5, 5);
}
public static T Add<T>(T parameter1, T parameter2) {
return null;
}
}
}이 문제를 해결하려면 default() 키워드를 사용해야 합니다. default(T)는 지정된 타입 T의 기본값을 반환합니다. 참조 타입이라면 null이, 값 타입(int, double 등)이라면 0과 같은 해당 타입의 초기값이 반환됩니다.
예제
using System;
namespace DemoApplication {
class Program {
public static void Main() {
Add(5, 5);
Console.ReadLine();
}
public static T Add<T>(T parameter1, T parameter2) {
var defaultVal = default(T);
Console.WriteLine(defaultVal);
return defaultVal;
}
}
}실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
0
실행 결과에서 확인할 수 있듯이, int 타입의 기본값인 0이 정상적으로 반환됩니다. 이처럼 제네릭 메서드에서 null 또는 기본값을 반환해야 하는 상황에서는 default(T)를 활용하는 것이 올바른 방법입니다.