public class IntClass
{
public int intMember { get; set; }
}
public class DoubleClass
{
public double doubleMember { get; set; }
}
public class StringClass
{
public string stringMember { get; set; }
}
이렇게 보면 멤버 변수의 타입이 다르다는 이유로, 여러 개의 클래스를 구현해야하는 경우 타입의 개수만큼 클래스를 구현해야한다는 단점이 있다.
이럴 경우에는 최상위 타입인 object타입으로 클래스를 구현하여 불필요한 클래스 구현을 방지할 수 있다.
public class ObjectClass
{
public object objMember{ get; set;}
}
Object타입으로 정의하면, 모든 타입으로 설정할 수 있지만, 안전한 방법이 아니고, 항상 명시적 캐스팅을 해야하기 때문에 런타임 시점에 문제가 발생할 가능성이 높다.
ObjectClass objClass = new ObjectClass();
objClass.objMember = (decimal)1000; //명시해줘야 함
Console.WriteLine(objClass.objMember.GetType().Name); // -> Decimal
이렇게 demical로 명시를 해줘야 한다.
ObjectClass objClass = new ObjectClass();
objClass.objMember = 1000;
Console.WriteLine(objClass.objMember.GetType().Name); // Int32
이것을 명시적으로 반환하지 않으면 int형으로 변환되겠지만 이러한 방식은 타입을 유추해야 하므로 좋은 방법은 아니다.
public class GenericClass<T>
{
public T objMember { get; set; }
}
다음 코드는 위에서 작성한 클래스를 제네릭 클래스로 변경한 코드이다.
GenericClass<int> genericObj = new GenericClass<int>();
제너릭 클래스인 GenericClass의 객체를 생성하는 방법이다.
제네릭 클래스 멤버 변수의 데이터 유형을 표시하는 기호이다.
일반적으로 Type의 약자인 T로 작성하며, 키워드를 입력하는 경우 에러가 발생한다.
위 코드에서 genericObj 객체를 생성할 때, <> 안에 int를 입력했으므로 objMember멤버 변수는 int형으로 치환된다.
GenericClass<int> genericObj = new GenericClass<int>();
genericObj.objMember = "TEST";
제네릭 클래스를 사용하여 int형으로 genericObj를 생성 후 objMember에 문자열을 할당하는 경우 컴파일 에러가 발생한다. 제네릭 클래스는 object타입에 비해 타입 검사를 엄격하게 하기 때문에 애플리케이션을 출시 또는 배포하기 전에 미리 문제를 해결할 수 있으며, 캐스팅 속도가 빠드라는 장점이 있다.
public class GenericClass<T>
{
public GenericClass() { }
public GenericClass(T t)
{
objMember = t;
}
public T objMember { get; set; }
}
static void Main(string[] args)
{
GenericClass<int> genericObj = new GenericClass<int>(10);
Console.WriteLine(genericObj.objMember); // 10
}
제네렉 클래스의 생성자에서 멤버 변수의 값을 초기화 할 수 있다.
public class GenericClass<T>
{
public GenericClass()
{
objMember = default(T);
}
public T objMember { get; set; }
}
static void Main(string[] args)
{
GenericClass<int> genericObj = new GenericClass<int>();
Console.WriteLine(genericObj.objMember); // 0
}
멤버 변수에 타입에 따라 기본값을 할당해야 하는 경우 default연산자를 사용할 수 있다.
숫자형은 0, 문자형은 " "이 할당된다.
제네릭 클래스는 멤버 변수의 데이터 타입때문에 여러 개의 클래스를 작성해야하는 경우 한 개의 클래스로 구현할 수 있는 기법이다.
불필요한 클래스 구현을 방지
타입 검사가 엄격하므로 애플리케이션을 배포하기 전에 미리 문제를 해결 가능
명시적 변환보다 속도가 빠름