본문 바로가기
Program Language/C#

Part3. C# 실력 다지기(3. dynamic형 사용하기)

by 토담이아빠 2023. 4. 7.

dynamic 형 사용하기

 

이전 포스팅에서 제네릭 클래스를 활용하여 여러 자료형에서 재사용 가능한 코드를 작성했었습니다. 그러나 제네릭 형식은 컴파일 시점에 형식 검사를 수행하기 때문에, 더하거나 비교하는 부분에서 컴파일 에러가 발생했었습니다. 이러한 문제는 dynamic 형을 사용하면 해결할 수 있습니다. 

 

dynamic형이란?


dynamic 형은 컴파일 시점에 형식 검사를 하지 않고, 런타임 시점에서 형식 검사를 수행하는 형식입니다. 즉, 변수나 메서드의 반환 형식 등에서 dynamic을 사용하면 해당 변수나 메서드의 반환 값이 무엇인지 컴파일 시점에는 알 수 없고, 런타임 시점에 실제로 사용되는 형식에 대해 검사를 수행합니다. 

 

예를 들어, dynamic 형식을 사용하여 문자열 변수 a와 정수형 변수 b를 더하는 경우를 살펴보겠습니다.


dynamic a = "10";
dynamic b = 5;
dynamic result = a + b;

위 코드에서는 a와 b가 각각 문자열과 정수형으로 선언되었지만, result 변수는 dynamic 형으로 선언되었습니다. 이렇게 하면 런타임 시점에서 a와 b의 실제 형식이 결정되고, 덧셈 연산이 수행됩니다. 위 경우 문자열 덧셈이 되어 "105"가 출력됩니다.

 

제네릭 형식에 적용

 

다음은 서두에서 언급했던 제네릭 형식을 이용하여 배열의 합, 평균, 최대값을 계산하는 예제입니다.


using System;
using System.Runtime.Intrinsics.X86;

class Program
{
    
    static void Main(string[] args)
    {
        int[] a = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 };
        double[] d = { 0.1, 2.2, 3.3, 4.5, 5.1, 6.7 };
        float[] f = { 1.2f, 5.3f, 7.8f, 6.1f, 3.4f, 8.8f };
        decimal[] c = { 123, 783, 345, 257, 249, 532 };

        Console.Write("a[] :");
        CalArray<int>(a);
        Console.Write("d[] :");
        CalArray<double>(d);
        Console.Write("f[] :");
        CalArray<float>(f);
        Console.Write("c[] :");
        CalArray<decimal>(c);
    }

    private static void CalArray<T>(T[] a) where T : struct
    {
        T sum = default(T);
        T avg = default(T);
        T max = default(T);

        foreach(dynamic item in a)
        {
            if(max < item)
            {
                max = item;
            }
            sum += item;
        }
        avg = (dynamic)sum / a.Length;
        Console.WriteLine("    Sum = {0}, Average = {1}, Max = {2}", sum, avg, max);
    }
}
[결과]

a[] :    Sum = 550, Average = 55, Max = 100
d[] :    Sum = 21.9, Average = 3.65, Max = 6.7
f[] :    Sum = 32.6, Average = 5.433333, Max = 8.8
c[] :    Sum = 2289, Average = 381.5, Max = 783

위 코드에서 main 메서드는, int, double, float, decimal 형식의 배열을 각각 선언하고, CalArray 메서드를 호출합니다. CalArray 메서드는 배열을 매개변수로 받아서 배열의 합, 평균, 최댓값을 계산하여 출력합니다.

 

CalArray 메소드에서는 제네릭 형식 T를 사용하며, where 제약 조건으로 struct 형식을 상속받습니다. 이는 T가 값 형식(struct)이어야 한다는 제약 조건을 의미합니다.

CalArray 메소드 내부에서는 dynamic 형식을 사용하여 계산을 수행합니다. 먼저, sum, avg, max 변수를 T 형식의 기본값으로 초기화한 후, foreach 루프를 사용하여 배열 a의 각 요소에 대해 max값을 갱신하고 sum을 계산합니다.

그러고 나서, avg를 계산하기 위해 sum을 dynamic 형식으로 형변환한 후, 배열의 길이로 나누어줍니다. 이렇게 함으로써 T 형식의 변수를 나눗셈 연산에 사용할 수 있게 됩니다.

마지막으로, 계산된 sum, avg, max 값을 Console.WriteLine 메서드를 사용하여 출력합니다.


댓글