Programming/C# - Window

C#/ 다이나믹(dynamic)

esoog Polaris 2023. 6. 29. 09:56
반응형

# dynamic

1. 외부 API와의 상호작용: 외부 API가 반환하는 데이터의 형식이 런타임에 결정되는 경우 `dynamic`을 사용하여 데이터를 처리할 수 있습니다. 예를 들어, JSON 데이터를 동적으로 처리하거나 외부 웹 서비스와 상호작용할 때 유용합니다.

dynamic apiResponse = ExternalApi.GetData();
string username = apiResponse.user.name;
int age = apiResponse.user.age;

 

2. 동적으로 변경되는 데이터 구조: 데이터 구조가 실행 시간에 동적으로 변경되는 경우 `dynamic`을 사용하여 데이터를 처리할 수 있습니다. 이는 동적인 구성 요소, 플러그인 시스템 또는 스크립트 엔진과 상호작용할 때 유용합니다.

dynamic data = GetDynamicData();
foreach (var item in data)
{
Console.WriteLine(item.Name);
Console.WriteLine(item.Value);
}


3. 리플렉션 대체: 리플렉션(로그램 실행 중에 프로그램의 구조와 정보를 검사하고 조작하는 기술. 이를 통해 개발자는 컴파일 시간에 알 수 없는 타입의 정보를 동적으로 탐색하고 조작/ ex: GetType() 같은 것을 말함.)을 사용하여 실행 시간에 타입의 멤버에 접근하는 대신 `dynamic`을 사용하여 간단하게 타입을 다룰 수 있습니다. 이는 특정 타입의 멤버를 동적으로 조작해야 할 때 유용합니다.

dynamic obj = GetDynamicObject();
string propertyName = "FirstName";
string propertyValue = obj[propertyName];


4. 동적인 코드 생성: 동적으로 코드를 생성하고 실행해야 할 때 `dynamic`을 사용할 수 있습니다. 이는 코드 생성 라이브러리, 동적 쿼리 작성 등에서 유용합니다.

dynamic code = GetDynamicCode();
code.Execute();


`dynamic`을 사용함으로써 정적인 타입 시스템의 제약에서 벗어나고 동적인 환경에서 유연하게 프로그래밍할 수 있습니다. 그러나 `dynamic`을 사용할 때는 컴파일 타임의 안정성 검사를 포기하게 되므로 주의해야 합니다. 잘못된 타입 사용이나 오타 등으로 인한 런타임 오류가 발생할 수 있으므로, 사용할 때에는 적절한 테스트와 예외 처리를 수행해야 합니다.

 

 

 

 

# 이해를 위한 추가 다이나믹 예제 코드

 

// 1. dynamic은 중간에 형을 변환할 수 있다.

dynamic v = 1;
// System.Int32 출력
Console.WriteLine(v.GetType());

v = "abc";
// System.String 출력
Console.WriteLine(v.GetType());


// 2. dynamic은 cast가 필요없다

object o = 10;
// 틀린표현
// (에러: Operator '+' cannot be applied to operands of type 'object' and 'int')
o = o + 20;
// 맞는 표현: object 타입은 casting이 필요하다
o = (int)o + 20;

// dynamic 타입은 casting이 필요없다.
dynamic d = 10;
d = d + 20;

 

 

 

 

# var와 dynamic 키워드 비교

 

`var`와 `dynamic`은 둘 다 C#에서 타입 추론을 지원하기 위해 사용되지만, 다음과 같은 중요한 차이점이 있습니다:

1. 정적 타입 vs. 동적 타입: `var`는 정적인 타입 추론을 사용하며, 컴파일 시간에 타입이 결정됩니다. 컴파일러는 변수의 초기화 식을 기반으로 변수의 타입을 추론합니다. 

반면에 `dynamic`은 실행 시간에 동적으로 타입이 결정됩니다. 컴파일러는 `dynamic` 변수에 대한 타입 검사를 수행하지 않으며, 변수의 멤버 접근 및 메서드 호출은 실행 시간에 해석됩니다.(런타임)

2. 타입 안정성: `var`는 여전히 정적 타입이므로, 컴파일 시간에 타입이 검사되고 잘못된 형식의 할당을 방지합니다. 

`dynamic`은 실행 시간에 타입이 결정되기 때문에 컴파일러가 타입 검사를 수행하지 않으며, 잘못된 형식의 할당이나 멤버 접근이 컴파일 시간에는 알 수 없습니다. 따라서 `var`는 정적 타입 안정성을 제공하고, `dynamic`은 동적 타입 유연성을 제공합니다.

3. 사용 시점: `var`는 주로 컴파일러가 알고 있는 타입을 명시적으로 표현하지 않고 코드를 간결하게 만들 때 사용됩니다. 변수의 초기화 식에서 타입을 추론하므로 코드의 가독성을 높일 수 있습니다. 

`dynamic`은 주로 동적인 상황에서 타입이 결정되는 경우나 외부 API와의 상호작용에서 사용됩니다. 실행 시간에 타입이 결정되어야 하는 상황에서 유용합니다.

컴파일러가 타입을 추론하는 데 `var`를 사용하면 정적 타입의 장점을 유지하면서 코드를 간결하게 만들 수 있습니다. 

반면에 `dynamic`은 실행 시간에 타입을 결정해야 하는 동적인 상황에서 유연성을 제공합니다. 따라서 `var`와 `dynamic`은 각각 다른 상황에서 사용되는데, 적절한 상황에서 사용하여 코드를 작성하는 것이 중요합니다.

 

728x90

'Programming > C# - Window' 카테고리의 다른 글

C#/ mysql 연동  (0) 2023.06.30
C#/ 스레드(Thread)  (0) 2023.06.29
C#/ LINQ(language integrated query)  (0) 2023.06.29
C#/ 람다(lambda)  (0) 2023.06.29
C#/ 대리자(델리게이트, delegate)k  (0) 2023.06.28