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
존재하고 AClass
는 IGenericInterface
상속 받았기 때문에 제네릭 활용이 가능하고 상속 받지 않은 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
키워드는 말 그대로 조건!
- 다중 제네릭!... (몇개 까지 가능할까..?)