2020. 11. 27. 16:25ใ์ ๊ณต ๊ณผ๋ชฉ/์๋์ฐ ํ๋ก๊ทธ๋๋ฐ
C# - ๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ(์ ๋ค๋ฆญ)
์ ๋ค๋ฆญ
- ๋ณ์์ ํ์ ๋งค๊ฐ๋ณ์๋ก ํ์ฌ ํด๋์ค๋ ๋ฉ์๋์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฌด๊ดํ๊ฒ ๊ธฐ์ ํ๋ ๊ธฐ๋ฒ.
- ์ค์ ํ ์ ๋ณด๋ "๊ฐ์ฒด ์์ฑ ์"์ ์ ๋ฌ๋ฐ์
์ ๋ค๋ฆญ๋ ํด๋์ค์ด๋ฉด์ ๋งค๊ฐ๋ณ์์ ๋ค์์ฑ์ ๋ด๋ ์ ๋์ ์ธ ํด๋์ค๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ฆ intํ์ ๋งค๊ฐ๋ณ์๊ฐ ๋ค์ด์ค๋ฉด intํ์ ๋ฐ๋ผ ๋ฐฐ์ด์ ๋ง๋ ๋ค๊ฑฐ๋, ๋ฉ์๋๋ฅผ ๋ง๋ค๊ณ , doubleํ์ ์ ํ์ด ๋ค์ด์ค๋ฉด doubleํ์ ์ ๋ง์ถฐ์ ํด๋์ค ๋ด๋ถ๊ฐ ์งํ์ด ๋๋ค.
์ ๋ค๋ฆญ ํด๋์ค ์ฌ์ฉ์ ์
class SimpleGeneric<T> {
private T[] values;
private int index;
public SimpleGeneric(int len)
{
values = new T[len];
index = 0;
}
public void Add(params T[] args)
{
foreach (T e in args)
values[index++] = e;
}
public void Print()
{
foreach (T e in values)
Console.Write(e + " ");
Console.WriteLine();
}
}
public class GenericClassExample {
static void Main(string[] args)
{
SimpleGeneric<Int32> gInteger = new SimpleGeneric<Int32>(10);
SimpleGeneric<Double> gDouble = new SimpleGeneric<double>(10);
gInteger.Add(1, 2);
gInteger.Add(1, 2, 3, 4, 5, 6, 7);
gInteger.Add(0);
gInteger.Print();
gDouble.Add(10.1, 20.2, 30.3);
gDouble.Print();
}
}
๊ฒฐ๊ณผ ํ๋ฉด
์์ Add๋ฐฐ์ด์์ ๋งค๊ฐ๋ณ์๋ก params๋ฅผ ์ ๋ ์ด์ ๋ ์ฌ๋ฌ๊ฐ์ ๊ฐ๋ค์ด ์ง์ ์ ์ผ๋ก ๋ค์ด์ค๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ค๋ฆญ ์ธํฐํ์ด์ค
์ ๋ค๋ฆญ๋ ์ธํฐํ์ด์ค๊ฐ ์กด์ฌํ๋ฉฐ ์ด๋ฅผ ๊ตฌํํ ๊ฒ์ ์๋์ ๊ฐ๋ค.
interface IGenericInterface<T>
{
void SetValue(T x);
string GetValueType();
}
class GenericClass<T> : IGenericInterface<T>
{
private T value;
public void SetValue(T x)
{
value = x;
}
public String GetValueType()
{
return value.GetType().ToString();
}
public class GenericInterfaceApp
{
static void Main(string[] args)
{
GenericClass<Int32> gInteger = new GenericClass<Int32>();
GenericClass<String> gString = new GenericClass<string>();
gInteger.SetValue(10);
gString.SetValue("Text");
Console.WriteLine(gInteger.GetValueType());
Console.WriteLine(gString.GetValueType());
}
}
}
์ธํฐํ์ด์ค๋ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ๋ถ๋ง ๊ตฌํํ ๋ค ์ฌ์ฉํ ์ ๋ค๋ฆญ ํด๋์ค์ ์์์์ผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํ๋ฉด ๋๋ค. GetType๋ฉ์๋๋ ํด๋น ๋ณ์์ ํ์ ์ ๋ฐํํด์ฃผ๋ ๋ฉ์๋์ด๋ค.
์ ๋ค๋ฆญ ๋ฉ์๋
- ์ ๋ค๋ฆญ ๋ฉ์๋๋ ์ ๋ค๋ฆญ ํด๋์ค์ฒ๋ผ ๋งค๊ฐ๋ณ์์ ๋ค์์ฑ์ ์ํด์ ๊ณ ์๋ ๋ฉ์๋์ด๋ค. ์ ์ํ ์ ์ ์ ๋ค๋ฆญ ํด๋์ค์ ํ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ๊ณผ ์ ๋ค๋ฆญ ๋ฉ์๋์ ํ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ด ๊ฐ์ ๋, ์๋ก ๋ ๋ฆฝ๋ ๊ฐ๋ ์ ๊ฐ์ง๋ ๊ฒ์ด๋ค.
์ฆ ์ ๋ค๋ฆญ ํด๋์ค๋ ๊ฐ์ฒด ์์ฑ ์์ ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌ๋ฐ๊ณ , ์ ๋ค๋ฆญ ๋ฉ์๋๋ ํธ์ถ ์์ ํ ๋งค๊ฐ๋ณ์๊ฐ ๊ฒฐ์ ์ด ๋๋ค.
์ ๋ค๋ฆญ ๋ฉ์๋ ์์
class GenericMethodApp
{
static void Swap<DataType>(ref DataType x, ref DataType y)
{
DataType temp;
temp = x; x = y; y = temp;
}
static void Main(string[] args)
{
int a = 1, b = 2; double c = 1.5, d = 2.5;
Console.WriteLine("Before: a ={0}, b = {1}", a, b);
Swap<int>(ref a, ref b);
Console.WriteLine("After : a= {0}, b = {1}", a, b);
Console.WriteLine("Before: c ={0}, d = {1}", c, d);
Swap<double>(ref c, ref d);
Console.WriteLine("After : c ={0}, b = {1}", c, d);
}
}
๋งค๊ฐ๋ณ์์ ref๋ฅผ ์ ๋ ์ด์ ๋ ์ฃผ์๋ฅผ ์ฐธ์กฐํ์ฌ ์ ๊ทผํด์ผ ์ค์ ๋ณ์๋ค์ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์์ธํ ๋ด์ฉ์ Call by value(๊ฐ), Call by reference(์ฐธ์กฐ)๋ฅผ ๊ฒ์ํด๋ณด์.
์ ๋ค๋ฆญ์ ํ๋ก๊ทธ๋จ์ ์ ๋ขฐ์ฑ์ ์ฆ์ง์ํค๊ธฐ ์ํด ์ ๋ฌ ๊ฐ๋ฅํ ์๋ฃํ์ ๋ฒ์๋ฅผ ์ ํํ ํ์๊ฐ ์๋ค.
์ด๋ฅผ ํ์ ์ํค๊ธฐ ์ํด where ๋ผ๋ ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
where T : S๋ผ๋ ๊ฒ ์ ๋ค๋ฆญ ํด๋์ค ์ ์ ๋ค์ ๋ถ๋๋ค๋ฉดSํ์ ์๋ธํด๋์คํ์ผ๋ก ์ ํํ๋ค์ ๋ป์ด ๋๋ค.
์์ค๋ฅผ ํตํด ํ์ธํด๋ณด์.
class GenericType<T> where T : SystemException
{
private T value;
GenericType(T v) { value = v; }
public override string ToString()
{
return "Type is" + value.GetType();
}
}
public class BoundedGenericApp
{
public static void Main(string[] args)
{
GenericType<NullReferenceException> gNullEx =
new GenericType<NullReferenceException>(new NullReferenceException());
GenericType<IndexOutOfRangeException> gIndexEx =
new GenericType<IndexOutOfRangeException>(new IndexOutOfRangeException());
Console.WriteLine(gNullEx.ToString());
Console.WriteLine(gIndexEx.ToString());
}
}
์ฌ๊ธฐ์ ์ค์ํ ์ ์ ๋๊ฐ์ง์ด๋ค.
1) where๋ฅผ ํตํด์ T์ ๋ฒ์๋ฅผ ์กฐ์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค. (์์ธ๋ง ์์๋ฐ์๊ธฐ์ String์ด๋ intํ์ด ์ฌ ์ ์๋ค.)
2) ์์ธ ๋ํ ๊ฐ์ฒด๊ฐ ๋ ์ ์๋ค.
'์ ๊ณต ๊ณผ๋ชฉ > ์๋์ฐ ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
C# - ๊ณ ๊ธํ๋ก๊ทธ๋๋ฐ (์์ธ) (0) | 2020.11.27 |
---|---|
C# ๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ - ์ ํธ๋ฆฌ๋ทฐํธ (0) | 2020.11.27 |
C# - ํ์ ํด๋์ค์ ์ธํฐํ์ด์ค(2) (0) | 2020.11.19 |
C# - ํ์ ํด๋์ค์ ์ธํฐํ์ด์ค (0) | 2020.11.19 |
C# - ์ปจํธ๋กค (2) | 2020.10.06 |