C#_ 제네릭

Today Jeeho Learned·2022년 11월 11일
0

C#

목록 보기
5/17
post-thumbnail
post-custom-banner

제네릭(Generics)

  • 제네릭 클래스는 클래스 내부의 멤버 변수의 데이터 타입을 일반화한 클래스이다.
  • 특정타입에 국한되지 않고, 모든 타입을 멤버변수의 타입으로 설정할 수 있다.
  • 제네릭 클래스말고 object타입으로 정의할 수 있지만, 안전한 방법이 아니고, 향후 문제가 발생할 가능성이 높기 때문에 좋은 방법은 아니다.

일반 클래스의 문제점

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형으로 변환되겠지만 이러한 방식은 타입을 유추해야 하므로 좋은 방법은 아니다.

제네릭 클래스(Generic Class)

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

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

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

제너릭 클래스인 GenericClass의 객체를 생성하는 방법이다.

<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, 문자형은 " "이 할당된다.

정리

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

  • 불필요한 클래스 구현을 방지

  • 타입 검사가 엄격하므로 애플리케이션을 배포하기 전에 미리 문제를 해결 가능

  • 명시적 변환보다 속도가 빠름

    출처

    https://developer-talk.tistory.com/206

profile
기록해야 (살아)남는다 !
post-custom-banner

0개의 댓글