-
dynamic 형을 사용하는 일반화 프로그램C# 예제 공부일기 2020. 7. 13. 19:29
C#은 강력한 형식 검사를 하는 언어이다. 앞에서 사용한 일반화 클래스에서 <T>로 정의된 값들은 더하거나 비교하는 부분에서 컴파일 시에 에러 메시지가 나옵니다. 왜냐하면 <T>는 사용자가 만든 클래스를 포함해서 어떠한 자료형도 올 수 있는데 이 자료들이 더하고나 비교할 수 있는 데이터인지 알 수 없기 때문이다,.
이 문제를 dynamic 키워드로 처리 가능하다. dynamic 형은 형식 검사를 컴파일 시에 하지 않고 실행한다. 실행할 때는 <T>에 대치되는 int, double 등의 형식이 사용되고 이런 데이터들은 더하거나 비교할 수 있기 때문에 에러가 발생하지 않는다.
저장하는 데이터의 형이 int, double,float,decimal 등 어떤 숫자형 배열이라도 적용할 수 있는 메소드를 dynamic과 일반화 프로그램으로 작성한다.
한마디로 말해서 짝궁 느낌이다. 프로그래머가 준 T라는 자료형에 대해서 대치를 시켜줘서 컴파일시 에러가 안나도록 하는 역할을 한다.
using System; using System.ComponentModel; namespace CPractice { class Program { static void Main(string[] args) { int[] a = { 10, 45, 32, 47, 85, 46, 93, 47, 50, 71 }; double[] d = { 0.1, 5.3, 6.7, 8.5, 4.9, 6.1 }; float[] f = { 1.2f, 5.3f, 7.8f, 6.1f, 3.4f, 8.8f }; decimal[] c = { 123, 783, 456, 234, 456, 748 }; PrintArray<int>("a[] : ", a); CalcArray<int>(a); PrintArray<double>("d[] : ", d); CalcArray<double>(d); PrintArray<float>("f[] : ", f); CalcArray<float>(f); PrintArray<decimal>("c[] : ", c); CalcArray<decimal>(c); } private static void CalcArray<T>(T[] a) where T:struct //요거 첨보는 거 { T sum = default(T); T avg = default(T); T max = default(T); foreach(dynamic item in a) { //item을 다이나믹으로 해서 해결봄 if (max < item) //컴파일 에러가 의심되는 부분 max = item; sum += item; } avg = (dynamic)sum / a.Length; //int형도 요부분에서 에러가 의심된다, Console.WriteLine(" Sum = {0}, Average = {1}, Max = {2}", sum, avg, max); } private static void PrintArray<T>(string s, T[] a)where T : struct { Console.Write(s); foreach(var item in a) { Console.Write(" {0}", item); } Console.WriteLine(); } } }
위와 같이 결과가 출력되는 것을 볼 수 있다.
dynamic을 빼버리게 되면 연산자가 T 와 T 사이엔 적용할 수 없다는 에러 메세지가 나온다. 그럴 때 dynamic 써보자
'C# 예제 공부일기' 카테고리의 다른 글
Stack<T>의 구현 (0) 2020.07.14 LinkedList 클래스를 활용한 프로그램 (0) 2020.07.13 LinkedList의 구현 (0) 2020.07.13 일반화 클래스(제네릭 클래스) (0) 2020.07.13 일반화 메소드 (제네릭 메소드) (0) 2020.07.13