ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.