본문 바로가기
프로그래밍

C# dynamic 키워드 활용법

by 이음코드 2025. 2. 2.
반응형

C#에서 dynamic 키워드는 정적 타입 언어인 C#에서 동적 타입처럼 사용할 수 있도록 해주는 기능입니다. 이는 런타임에서 타입을 확인하고 메서드를 호출할 수 있도록 도와주며, COM 개체 및 JSON 파싱 등 다양한 시나리오에서 유용하게 사용됩니다.
이 글에서는 dynamic 키워드의 개념과 활용법을 다양한 예제와 함께 살펴보겠습니다.


1. dynamic 키워드란?

C#의 dynamic 키워드는 컴파일 시 타입을 확인하지 않고, 런타임에 해당 타입을 결정하는 기능을 제공합니다. 이는 var 키워드와 다르게 동적으로 작동하며 컴파일러가 타입 검사를 하지 않기 때문에 유연하게 사용할 수 있습니다.
(1) dynamic vs var
  - dynamic
   . 타입 결정 시점 : 런타임
   . 특징 : 타입이 컴파일 시 결정되지 않으며 런타임에서 메서드와 속성을 확인함
  - var
   . 타입 결정 시점 : 컴파일 타임
   . 특징 : 타입이 명확해야 하며 컴파일러가 타입을 추론함

2. dynamic 기본 사용법

dynamic 키워드를 사용하면 변수의 타입이 런타임에서 결정되며 다양한 타입을 유연하게 다룰 수 있습니다.
예제

using System;

class Program
{
    static void Main()
    {
        dynamic value = 10;
        Console.WriteLine(value); // 출력: 10

        value = "Hello, Dynamic!";
        Console.WriteLine(value); // 출력: Hello, Dynamic!

        value = 3.14;
        Console.WriteLine(value); // 출력: 3.14
    }
}

위 코드에서는 value 변수가 처음에는 int 그 다음에는 string 마지막에는 double 타입을 가지게 됩니다. dynamic을 사용하면 변수의 타입을 변경해도 컴파일러가 오류를 발생시키지 않습니다.

3. dynamic의 주요 특징

(1) 메서드 호출
dynamic 타입의 변수는 런타임에서 실제 메서드와 속성을 결정하므로 컴파일러가 존재하지 않는 메서드 호출을 미리 감지하지 못합니다.

using System;

class Program
{
    static void Main()
    {
        dynamic obj = new Sample();
        Console.WriteLine(obj.GetMessage()); // 출력: Dynamic 호출
    }
}

class Sample
{
    public string GetMessage() => "Dynamic 호출";
}

만약 GetMessage 메서드가 존재하지 않는다면 컴파일 단계에서는 오류가 발생하지 않지만 런타임에서 RuntimeBinderException이 발생합니다.

(2) 연산 처리
Dynamic 타입의 변수는 연산시에도 런타임에서 타입을 결정하여 처리합니다.

dynamic a = 10;
dynamic b = 20;
Console.WriteLine(a + b); // 출력: 30

dynamic c = "Hello, ";
dynamic d = "World!";
Console.WriteLine(c + d); // 출력: Hello, World!

위 코드에서 a+b는 정수 연산이지만 c+d는 문자열 연결로 동작합니다.

4. dynamic의 주요 활용 사례

(1) JSON 데이터 처리
C#에서 dynamic은 JSON데이터를 다룰 때 유용하게 사용할 수 있습니다. Newtonsoft.Json 라이브러리를 이용하면 JSON을 dynamic으로 쉽게 변환할 수 있습니다.

using System;
using Newtonsoft.Json;

class Program
{
    static void Main()
    {
        string json = "{ \"Name\": \"John\", \"Age\": 30 }";
        dynamic person = JsonConvert.DeserializeObject<dynamic>(json);

        Console.WriteLine(person.Name); // 출력: John
        Console.WriteLine(person.Age);  // 출력: 30
    }
}

위 코드에서는 JSON문자열을 dynamic 객체로 변환하여 속성을 바로 접근할 수 있습니다.

(2) COM 개체 및 리플렉션 활용
COM 개체(예: Excel, Word)와 상호작용할 때 dynamic을 사용하면 코드가 간결해집니다.

using System;
using Excel = Microsoft.Office.Interop.Excel;

class Program
{
    static void Main()
    {
        Excel.Application excelApp = new Excel.Application();
        excelApp.Visible = true;

        dynamic workbook = excelApp.Workbooks.Add();
        dynamic sheet = workbook.ActiveSheet;
        sheet.Cells[1, 1].Value = "Hello, Excel!";
    }
}

COM 개체는 인터페이스가 명확하지 않은 경우가 많기 때문에 dynamic을 사용하면 직관적인 접근이 가능합니다.

(3) 리플렉션과 결합
dynamic을 리플렉션과 함께 사용하면 런타임에서 객체를 동적으로 다룰 수 있습니다.

using System;

class Sample
{
    public void Hello() => Console.WriteLine("Hello from Sample!");
}

class Program
{
    static void Main()
    {
        Type type = typeof(Sample);
        dynamic instance = Activator.CreateInstance(type);
        instance.Hello(); // 출력: Hello from Sample!
    }
}


5. Dynamic 사용 시 주의할 점

(1) 성능 저하
dynamic을 사용할 경우 C#의 정적 타입보다 성능이 저하될 수 있습니다. 이는 런타임 바인딩을 수행해야 하기 때문입니다.

(2) 타입 안정성 부족
컴파일 타임에서 타입 검사가 이루어지지 않으므로 존재하지 않는 메서드를 호출하면 런타임 오류(RuntimeBinderException)가 발생할 수 있습니다.

dynamic obj = new Sample();
Console.WriteLine(obj.NonExistentMethod()); // 런타임 오류 발생!

(3) 자동 완성 및 리팩토링 어려움
dynamic을 사용하면 개발 도구의 자동 완성이 제한되며, 코드 리팩토링이 어려워질 수 있습니다.

6. 정리

dynamic 키워드는 C#에서 유연한 프로그래밍을 가능하게 하며 JSON 데이터 처리, COM 개체 활용, 리플렉션 등 다양한 상황에서 유용하게 사용 할 수 있습니다. 하지만 성능 저하와 타입 안전성 문제를 고려하여 필요할 때만 사용하는 것이 좋습니다.

(1) dynamic 활용
- JSON 처리 : JSON을 동적으로 다룰 때 유용
- COM 개체 : Excel, Word 등의 COM 개체를 쉽게 제어 가능
- 리플렉션 : 런타임에 객체를 동적으로 다룰 때 활용 가능
- 유연한 메서드 호출 : 런타임에서 존재하는 메서드만 호출 가능

반응형