Generic

tacoyaggi ㅣ 2024. 2. 2. 09:45

Generic 란?

  • 데이터 형식을 일반화하여 재사용 가능한 코드를 작성할 수 있게 해주는 키워드
  • 클래스, 인터페이스, 메서드 등에서 특정 데이터 형식을 제공하여 다양한 데이터 형식에 대해 동작하도록 만들 수 있음

Generic 예제

  • 아래 예제 코드 보면 Generic은 클래스, 메서드, 필드에서 사용 가능하고 <T> 를 붙혀준다. 꼭 <T>일 필요는 없다.
  • 제네릭이 아니라면 아래 예제의 필드 , 메서드 부분에서 int , string , object 형식으로 각각 생성해야 하지만 Generic 을 통해서 코드의 재사용성을 향상 시켰다.
  • 호출 하는 단계에서 반환 형태를 지정할 수 있으므로 결합도가 낮아 졌다고 볼 수 있을 것 같다.
GenericClass<int> intInstance = new GenericClass<int>(100);
int intResult = intInstance.GetValue();
Console.WriteLine(intResult);

GenericClass<string> stringInstance = new GenericClass<string>("철수");
string stringResult = stringInstance.GetValue();
Console.WriteLine(stringResult);

GenericClass<object> objectInstance = new GenericClass<object>(Enum.가);
object enumResult = objectInstance.GetValue();
Console.WriteLine(enumResult);



// 제네릭 클래스
public class GenericClass<T>
{
// 제네릭 필드
    private T genericField;
// 제네릭 메서드
    public GenericClass(T value)
    {
        genericField = value;
    }

    public T GetValue()
    {
        return genericField;
    }
}

enum Enum
{
    가,
    나
}

where 키워드

  • 제네릭에서 where 라는 키워드가 있는데, 제약을 의미함 여기서 제약은 특정 형식만을 허용하는 제한을 의미함
  • 아래 코드에서 public class GenericClass<T> where T : IGenericInterface 부분을 보면 where 키워드와 함께 IGenericInterface 상속 받고 있다.
  • IGenericInterface 인터페이스를 상속 받아야만 한다는 제약이 생성 된 것이다.
  • 아래 코드에서 AClass BClass 존재하고 AClassIGenericInterface 상속 받았기 때문에 제네릭 활용이 가능하고 상속 받지 않은 BClass 경우 제네릭 사용이 불가능 하다.
GenericClass<AClass> A = new GenericClass<AClass>();
GenericClass<BClass> B = new GenericClass<BClass>(); // 오류


public interface IGenericInterface
{
    public void Get();
}

public class AClass : IGenericInterface
{
    public void Get()
    {
        Console.WriteLine("AClass");
    }
}

public class BClass
{
    public void Get()
    {
        Console.WriteLine("BClass");
    }
}

public class GenericClass<T> where T : IGenericInterface
{

}

다중 Generic

  • 다중 제네릭 이란 2개 이상의 제네릭 형태를 의미 한다.
  • 기본적으로 <T> 형식으로 사용한다고 했지만 다중 제네릭은 <T,A,B> 이런 형태가 가능하다.
  • 물론 where 제한도 각각 가능하다.
  • 대표적으로 Dictionary<T,A> 존재 한다.
public class GenericClass<T,A> where T : IGenericInterface where A : struct
{

}

결론

  • Generic 은 정해진 타입에 구애 받지 않고 유연함을 제공해주는 예약어
  • where 키워드는 말 그대로 조건!
  • 다중 제네릭!... (몇개 까지 가능할까..?)

'SW 기능 > C#' 카테고리의 다른 글

Interface  (0) 2024.02.02
Get Set  (0) 2024.02.02
Base  (0) 2024.02.02
접근제한자  (0) 2024.02.01
추상화 (Abstract)  (0) 2024.02.01