728x90
C#의 동적 언어 기능은 개발자가 런타임에 변경될 수 있는 타입과 객체를 다룰 수 있게 해줍니다. .NET에서 제공하는 가장 강력한 동적 타입 중 하나는 ExpandoObject입니다. 이 기능은 객체의 속성과 메서드를 런타임에 추가, 수정 또는 제거할 수 있게 해줍니다. ExpandoObject를 이해하면 유연하고 적응력 있는 코드를 작성하는 능력을 크게 향상시킬 수 있습니다.
ExpandoObject란 무엇인가?
정의
ExpandoObject는 C#의 System.Dynamic 네임스페이스의 일부로, 속성, 메서드, 이벤트를 동적으로 추가할 수 있는 객체를 생성할 수 있게 해줍니다.
사용 사례
ExpandoObject를 사용하는 일반적인 시나리오는 다음과 같습니다:
- 런타임까지 구조가 알려지지 않는 JSON 데이터를 다룰 때.
- 웹 API나 데이터 조작 작업과 같은 응용 프로그램을 위한 동적 데이터 구조를 생성할 때.
- 다양한 외부 서비스를 다룰 때와 같이 유연성이 중요한 모델을 구축할 때.
728x90
주요 특징
- 동적 속성:
ExpandoObject인스턴스에 사전 정의된 클래스 구조 없이도 즉석에서 속성을 추가할 수 있습니다.
- 동적 메서드:
- 다양한 프로그래밍 요구에 맞게 메서드를 동적으로 정의할 수 있는 기능을 제공합니다.
- 상호 운용성:
- C#의 다른 동적 기능과 원활하게 작동하며, 동적 타입을 포함하는 컬렉션에 대한 LINQ 쿼리와 같은 작업을 지원합니다.
- 유연성:
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을 생성합니다. - 그런 다음 두 개의 속성(
Name과Age)을 객체에 직접 추가합니다. - 사람의 세부 정보를 출력하는
Introduce라는 메서드도 동적으로 정의됩니다. - 이 메서드를 호출한 후, 기존 속성(
Age) 중 하나를 업데이트하고 그 값을 다시 출력합니다. - 마지막으로, 인터페이스(
IDictionary<string, object>)로 캐스팅하여 동적 객체에서 속성을 제거하는 방법을 보여주며, 그 유연성을 더욱 강조합니다.
결론
중급 C# 프로그래밍에서 ExpandoObject를 사용하면 런타임에 알 수 없거나 변경되는 데이터 구조를 다룰 때 개발자에게 상당한 유연성을 제공합니다. 이 기능을 C#의 다른 부분과 효과적으로 결합함으로써, 프로그래머는 엄격한 타입 정의에 구애받지 않고 복잡한 시나리오를 처리할 수 있는 견고한 애플리케이션을 구축할 수 있습니다. 이러한 적응력은 현대 소프트웨어 개발 환경에서 민첩성과 대응력이 성공의 주요 동력이 되는 상황에서 특히 유용합니다.
728x90
'프로그래밍 > C#' 카테고리의 다른 글
| 의존성 주입(Dependency Injection)으로 소프트웨어 개발의 유연성 높이기 (0) | 2025.09.09 |
|---|---|
| C#의 DynamicObject: 유연한 프로그래밍을 위한 강력한 도구 (0) | 2025.09.08 |
| C#의 동적 타입: 유연성과 도전의 조화 (0) | 2025.09.07 |
| C# 사용자 정의 속성: 코드에 메타데이터를 추가하는 강력한 도구 (0) | 2025.09.07 |
| C#의 사전 정의된 속성: 코드에 메타데이터를 추가하는 강력한 도구 (0) | 2025.09.06 |