프로그래밍/C#

C#의 ExpandoObject: 동적 프로그래밍의 새로운 가능성

shimdh 2025. 9. 8. 09:28
728x90

C#의 동적 언어 기능은 개발자가 런타임에 변경될 수 있는 타입과 객체를 다룰 수 있게 해줍니다. .NET에서 제공하는 가장 강력한 동적 타입 중 하나는 ExpandoObject입니다. 이 기능은 객체의 속성과 메서드를 런타임에 추가, 수정 또는 제거할 수 있게 해줍니다. ExpandoObject를 이해하면 유연하고 적응력 있는 코드를 작성하는 능력을 크게 향상시킬 수 있습니다.

ExpandoObject란 무엇인가?

정의

ExpandoObject는 C#의 System.Dynamic 네임스페이스의 일부로, 속성, 메서드, 이벤트를 동적으로 추가할 수 있는 객체를 생성할 수 있게 해줍니다.

사용 사례

ExpandoObject를 사용하는 일반적인 시나리오는 다음과 같습니다:

  • 런타임까지 구조가 알려지지 않는 JSON 데이터를 다룰 때.
  • 웹 API나 데이터 조작 작업과 같은 응용 프로그램을 위한 동적 데이터 구조를 생성할 때.
  • 다양한 외부 서비스를 다룰 때와 같이 유연성이 중요한 모델을 구축할 때.
728x90

주요 특징

  1. 동적 속성:
    • ExpandoObject 인스턴스에 사전 정의된 클래스 구조 없이도 즉석에서 속성을 추가할 수 있습니다.
  2. 동적 메서드:
    • 다양한 프로그래밍 요구에 맞게 메서드를 동적으로 정의할 수 있는 기능을 제공합니다.
  3. 상호 운용성:
    • C#의 다른 동적 기능과 원활하게 작동하며, 동적 타입을 포함하는 컬렉션에 대한 LINQ 쿼리와 같은 작업을 지원합니다.
  4. 유연성:
    • ExpandoObject의 구조는 고정되어 있지 않으며, 실행 중에 애플리케이션 요구 사항에 따라 자유롭게 수정할 수 있습니다.

실용적인 예제

ExpandoObject를 사용하는 실용적인 예제를 살펴보겠습니다:

using System;
using System.Collections.Generic;
using System.Dynamic;

class Program
{
    static void Main()
    {
        // 새로운 ExpandoObject 생성
        dynamic person = new ExpandoObject();

        // 속성을 동적으로 추가
        person.Name = "John Doe";
        person.Age = 30;

        // 메서드를 동적으로 추가
        person.Introduce = (Action)(() =>
            Console.WriteLine($"Hello, my name is {person.Name} and I am {person.Age} years old.")
        );

        // 메서드 호출
        person.Introduce();

        // 기존 속성 수정
        person.Age += 1; 

       // 업데이트된 정보 표시
       Console.WriteLine($"{person.Name} just had a birthday! Now they are {person.Age}.");

       // 속성을 동적으로 제거 (필요한 경우)
       var expDict = (IDictionary<string, object>)person;
       expDict.Remove("Age");

       Console.WriteLine($"After removing age: Name={person.Name}, Age={expDict.ContainsKey("Age")}");
    }
}

예제 설명

  • 이 예제에서는 ExpandoObject의 인스턴스인 person을 생성합니다.
  • 그런 다음 두 개의 속성(NameAge)을 객체에 직접 추가합니다.
  • 사람의 세부 정보를 출력하는 Introduce라는 메서드도 동적으로 정의됩니다.
  • 이 메서드를 호출한 후, 기존 속성(Age) 중 하나를 업데이트하고 그 값을 다시 출력합니다.
  • 마지막으로, 인터페이스(IDictionary<string, object>)로 캐스팅하여 동적 객체에서 속성을 제거하는 방법을 보여주며, 그 유연성을 더욱 강조합니다.

결론

중급 C# 프로그래밍에서 ExpandoObject를 사용하면 런타임에 알 수 없거나 변경되는 데이터 구조를 다룰 때 개발자에게 상당한 유연성을 제공합니다. 이 기능을 C#의 다른 부분과 효과적으로 결합함으로써, 프로그래머는 엄격한 타입 정의에 구애받지 않고 복잡한 시나리오를 처리할 수 있는 견고한 애플리케이션을 구축할 수 있습니다. 이러한 적응력은 현대 소프트웨어 개발 환경에서 민첩성과 대응력이 성공의 주요 동력이 되는 상황에서 특히 유용합니다.

728x90