C#

[C#]제네릭 클래스(Generic Class)

DevStory 2021. 9. 22.

제네릭 클래스(Generic Class)란?

제네릭 클래스(Generic Class)는 클래스 내부의 멤버 변수의 데이터 타입을 일반화한 클래스입니다.

 

특정 타입에 국한되지 않고 모든 타입을 멤버 변수의 타입으로 설정할 수 있습니다.

 

제네릭 클래스를 사용하지 않고 멤버 변수의 타입을 object 타입으로 정의할 수 있지만, 안전한 방법이 아니며, 향후 문제가 발생할 가능성이 높기 때문에 좋은 방법은 아닙니다.

 

이번 포스팅에서는 일반 클래스로 멤버 변수의 타입이 여러개인 경우와 제네릭 클래스(Generic Class)에 대해 정리하였습니다.

 


일반 클래스의 문제점

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

즉, decimal 형이라고 명시적으로 형 변환을 해주어야 합니다.

 

ObjectClass objClass = new ObjectClass();

objClass.objMember = 1000;

Console.WriteLine(objClass.objMember.GetType().Name); // Int32

명시적 형 변환을 하지 않으면, 자동으로 Int형으로 변환되겠지만 이러한 방식은 타입을 유추해야 하므로 좋은 방법은 아닙니다.

반응형

제네릭 클래스(Generic Class)

다음 코드는 위에서 작성한 클래스를 제네릭 클래스로 변경한 코드입니다.

public class GenericClass<T>
{
  public T objMember { get; set; }
}

 

제네릭 클래스인 GenericClass의 객체를 생성하는 방법입니다.

GenericClass<int> genericObj = new GenericClass<int>();

 

<T>는 무엇인가?

<T>는 제네릭 클래스 멤버 변수의 데이터 유형을 표시하는 기호입니다.

 

일반적으로 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, 문자형은 ""이 할당됩니다.


정리

제네릭 클래스는 멤버 변수의 데이터 타입 때문에 여러 개의 클래스를 작성해야 하는 경우 한 개의 클래스로 구현할 수 있는 기법입니다.

  • 불필요한 클래스 구현을 방지합니다.
  • 타입 검사가 엄격하므로 애플리케이션을 배포하기 전에 미리 문제를 해결할 수 있습니다.
  • 명시적 변환보다 속도가 빠릅니다.
반응형

댓글