π» Programming Language/C#
26. μ λ€λ¦μ€(Generics) νμ μ μ½
S.Honey
2022. 4. 7. 09:38
μ λ€λ¦μ€ νμ μ μ½
μμμ λμ¨
μΌλ°ν λ©μλ
,μΌλ°ν ν΄λμ€
μμ μ¬μ©νλT(Type Parameter)
λ λͺ¨λ λ°μ΄ν° νμμ λμ ν μ μλλ§€κ°λ³μ
λ‘ μ¬μ©λμλ€.λͺ¨λ νμμ λμ νλ λ§€κ°λ³μκ° νμν μλ μμ§λ§ κ·Έλ μ§ μμ κ²½μ°λ μ‘΄μ¬ν μ μλ€.
- κ·Έλ° κ²½μ°μλ λ§€κ°λ³μμ μ μ½ μ‘°κ±΄μ μ€ μ μλ€.
μ μ½ μ‘°κ±΄ μ£Όλ λ°©λ²μΌλ‘
where
μ μ μ΄μ©νλ€.
Ex)
class DemoList<T> where T : DemoClass
{
...
}
- μμ κ°μ κ²½μ°μ
T
λΌλ λ§€κ°λ³μλ"DemoClassλ‘ λΆν° μμλ°λ νμμ΄μ΄μΌ νλ€"
λΌλ μλ―Έ
void CopyData<T>(T a, T b) where T : struct
// structλ κΈ°λ³Έμ μΌλ‘ value type(κ° νμ)
{
...
}
- μμ κ°μ κ²½μ°
T
λ"κ° νμμ΄μ΄μΌ νλ€"
λΌλ μ μ½μ‘°κ±΄μ μ€ μλ―Έμ΄λ€.
μ λ€λ¦μ€μμ μ μ½μ‘°κ±΄μ μ£Όλ λ°©μμ
where T: μ μ½μ‘°κ±΄
μ μ½μ‘°κ±΄μ μ’ λ₯
λ¬Έλ² | μλ―Έ |
---|---|
where T : struct | Tκ° κ°νμμ΄μ΄μΌ νλ€. |
where T : class | Tλ μ°Έμ‘°νμμ΄μ΄μΌ νλ€. |
where T : new() | Tλ λ°λμ κΈ°λ³Έ μμ±μκ° μμ΄μΌ νλ€.(λ§€κ°λ³μκ° μλ μμ±μμ¬μΌ νλ€.) => κΈ°λ³Έμμ±μκ° μμΌλ©΄ μλλ€. |
where T : κΈ°λ°ν΄λμ€λͺ | Tλ κΈ°λ° ν΄λμ€μ νμ ν΄λμ€μ¬μΌ νλ€. |
where T : μΈν°νμ΄μ€λͺ | Tλ ν΄λΉ μΈν°νμ΄μ€λ₯Ό λ°λμ ꡬνν΄μΌ νλ€.(μΈν°νμ΄μ€ λͺ μ μ¬λ¬κ°κ° μ¬ μ μλ€.) |
where T : U | Tλ λ λ€λ₯Έ νμ λ§€κ°λ³μ Uλ‘λΆν° μμλ°μ ν΄λμ€μ¬μΌ νλ€. |
Generic μ μ½μ‘°κ±΄ νμ© μμ μ½λ
namespace GenericsConstraintEx
{
class DemoArray1<T> where T : struct
{
public T[] Array { get; set; }
public DemoArray1(int size)
{
Array = new T[size];
}
public int Length
{
get { return Array.Length; }
}
}
class DemoArray2<T> where T : class
{
public T[] Array { get; set; }
public DemoArray2(int size)
{
Array = new T[size];
}
}
class Parent { }
class Child : Parent { }
class DemoArray3<U> where U : Parent
{
public U[] Array { get; set; }
public DemoArray3(int size)
{
Array = new U[size];
}
public void CopyData<T>(T[] a) where T : U
{
a.CopyTo(Array, 0);
//Arrayλ‘ 0λ² μΈλ±μ€λΆν° 볡μ¬νλ€λ μλ―Έ
}
}
class Program
{
public static T CreateInstance<T>() where T : new()
{
return new T();
}
static void Main(string[] args)
{
DemoArray1<int> aa = new DemoArray1<int>(2);
aa.Array[0] = 11;
aa.Array[1] = 22;
for (int i = 0; i < aa.Length; i++)
{
Console.WriteLine(aa.Array[i]);
}
//DemoArray2<int> bb = new DemoArray2<int>(2);
// => μ΄λ κ² μ¬μ©νλ©΄ DemoArray2λ class ν μ μ½μ‘°κ±΄μΌλ‘ μΈν΄ μ€λ₯κ° λ°μνλ€.
DemoArray2<DemoArray1<double>> bb = new DemoArray2<DemoArray1<double>>(2);
bb.Array[0] = new DemoArray1<double>(3);
bb.Array[1] = new DemoArray1<double>(10);
DemoArray3<Parent> cc = new DemoArray3<Parent>(3);
cc.Array[0] = new Parent();
cc.Array[1] = new Child();
//childλ parentλ₯Ό μμνκΈ°μ κ°λ₯νλ€.
cc.Array[2] = CreateInstance<Parent>();
DemoArray3<Child> dd = new DemoArray3<Child>(2);
//dd.Array[0] = Parent();
// => Uνμ
μ΄ Childλ‘ μ μΈλμκΈ° λλ¬Έμ λΆλͺ¨ν΄λμ€μΈ Parentλ λ€μ΄κ° μ μλ€.
dd.Array[0] = new Child();
dd.Array[1] = CreateInstance<Child>();
DemoArray3<Child> ee = new DemoArray3<Child>(2);
ee.CopyData<Child>(dd.Array);
//μ£Όμ : λ¨ λ°°μ΄μ κΈΈμ΄λ κ°μμΌν¨.
}
}
}
Output
11
22