본문 바로가기
프로그래밍/개발일지

C# Dynamic

by 개발하는군인 2023. 4. 20.

var 를 활용해서 개발을 하다보니 실제로 클래스의 멤버필드를 알고 있어도 알고 있어도 컴파일러에 의해 값이 결정되니 다른곳에서 접근할때 정의되어 있지않다고 빌드 전 부터 에러가 발생하였다. 그래서 인터넷을 검색 하다보니 Dynamic 이라는 키워드에 대해 알게되어 해당 내용을 정리해두고 기록해둔다.

Dynamic ?

 

프로그래밍 언어는, 타입을 구분하는 방식으로, 컴파일시 Tpye을 확인하는 Static Language 와 런타임시 Type을 

판별하는 Dynamic Language로 구분 할 수 있다. C# 기본적으로 Static Language 속하지만  C# 4.0 에서는 DLR 를 추 가함으로써 Dynamic Language 가 갖는 기능을 언어와 Framework에 수용하였다.

 

dynamic 키워드는 컴파일러에게 변수의 Type을 체크하지 않도록 하고 런타임시까지는 해당 타입을 알 수 없음을 표시한다. 내부적으로는 dynamic 타입은 object 타입을 사용하므로 dynamic 타입의 변수는 중간에 다른 타입의 값을 가질 수 있다. dynamic 변수에 숫자를 할당했다가 나중에 다시 문자열을 할당하는 것이 가능하다.

(var는 컴파일러에의해 초기화 시 Type이 결정되며 다른 자료형으로 변경이 불가능 하다)

 

내부적으로 object 타입을 사용 한다고해서 object와 dynamic 타입이 같다고 생각 할 수 있지만  object 타입은 명시적 타입의 속성과 메서드를 사용하기 위해서는 사용전에 캐스팅을 통해 명시적 타입으로 변경 후에 사용해야 하는 반면, dynamic 타입은 캐스팅이 없어도 실제 타입의 메서드와 속성을 사용할 수 있다.

 

Dynamic 간편예제 

 

dynamic은 런타임시 값이 결정된다고 했다. 그렇기 밑에 코드를 보면 알수있다시피 값을 자료형을 변경할 수 있다. 그리고 Object 타입과는 다르게 캐스팅이 필요 없다. 

 

익명타입에 dynamic 사용 예제 

 

var는 파라미터 값의로 쓰일수 없고 object로 감싼다고해도 object 사용전  실제 명시적 타입의로 바꿔야하는데익명타입에 대한 정보가 없기 때문에 사용이 불가능하다. 가능하다고 해도 익명타입을 쓰는 이유가 사라진다.하지만  dynamic은 컴파일러에게 하나의 정적 Type으로 인식되기 때문에 메서드 원형에서도 int-string 같이 -파라미터 타입에 dynamic으로 지정할 수 있다. 전달된 dynamic 파라미터는 그 dynamic 객체로부터 직접 속성을 호출할 수있다. 

 

그렇기 때문에 2번째 코드 예제 처럼 사용이 가능하다. 하지만 두번째 코드는 큰문제를 가지고있다. 첫째는 익명타입 생성도니 후 다시 새로운 속성을 추가할 수 ㅇ벗고 또 한 익명타입 자체가 메서드 이벤트 이벤트 등을 갖지 못하기 때문에, 이러한 멤버를 동적으로 할당하여 dynamic 타입에서 추가할 수 없다.

 

두번째는 동일한 어셈블리가 아닌 다름 어셈블리에 놓인다면, 이 코드는 에러를 발생시킨다. 코드에서 dynamic 타입이 익명타입인데 다른 어셈블리에서는 이 익명타입을 볼 수 없기 때문이다.

 

ExpandoObject 사용 예제 

 

ExpanddoObject 위에서 발생한 두가지 문제를 해결 할 수 있다.  DLR 네임스페이스인 System.Dynamic 에는 2개의 클래스가 존재한다. 개발자가 dynamic 타입을 쉽게 생성하도록 도와주는 ExpandoObject 클래스와 보다 Customization을 위한 고급 dynamic 기능을 지원하는 DynamicObject 클래스 이다.  ExpandoObject 클래스는 dynamic 타입에 속성, 메서드, 이벤트를 동적으로 쉽게 할당할 수 있게 도와주는 클래스이다.

 

1). ExpandoObject 클래스로부터 객체를 생성한 후 이를 dynamic 변수에 할당한다. 

2). dynamic 타입의 변수에서 새로운 속성, 메서드 혹은 이벤트를 할당한다.

3). dynamic 타입은 파라미터로 타 메서드에 전달할수있다.

4). ExpandoObject 클래스로부터 생성된 dynamic 타입은 다른 어셈블리로 전달되는 경우에도 문제 없이 사용할 수 있다.

 

 

 

 

 

'프로그래밍 > 개발일지' 카테고리의 다른 글

UTC 변경 시 시간 처리  (0) 2024.05.17
ZeroMq (1) C#  (0) 2023.04.20
C# Anonymous types  (0) 2023.04.19
Winform 최소화 전 사이즈 저장  (0) 2023.04.18
C# Nlog 로깅 시간 + 용량 로테이션  (0) 2023.04.10