์ ๋ค๋ฆญ์ค ํ์ ์ ์ฝ
์์์ ๋์จ
์ผ๋ฐํ ๋ฉ์๋
,์ผ๋ฐํ ํด๋์ค
์์ ์ฌ์ฉํ๋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
'๐ป Programming Language > C#' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
28. ์์ธ์ฒ๋ฆฌ(Exception Handling) (0) | 2022.04.07 |
---|---|
27. ์ ๋ค๋ฆญ ์ปฌ๋ ์ (0) | 2022.04.07 |
25. ์ ๋ค๋ฆญ์ค(Generics) (0) | 2022.04.07 |
24. yield ํค์๋ (0) | 2022.04.07 |
23. ์ปฌ๋ ์ ์ด๊ธฐํ, ์ธ๋ฑ์ (0) | 2022.04.07 |