[C# 4.0] Dynamic 예약어

eunjin lee·2022년 10월 5일
0

C# 9.0 프로그래밍

목록 보기
35/50

CLR을 바탕으로 한 DLR(Dynamic Language Runtime) 라이브러리를 통해, 루비나 파이썬 같은 동적 언어도 닷넷 프레임워크에 실행될 수 있다. 이런 동적 언어로 만들어진 프로그램의 타입을 정적 언어인 C#에 연동하기 위해 dynamic 예약어가 제공된다.


dynamic 예약어

  • dynamic은 컴파일 시점에 타입을 결정하지 않고, 해당 프로그램이 실행되는 시점에 타입을 결정한다.

💡 샘플 코드

static void Main(string[] args)
{
	var a = 5;
	//a = "str";  //컴파일 오류 : 앞 줄에서 a의 타입이 int로 결정되었음.

	dynamic b = 10;
	b = "str";  //b의 형식이 결정되지 않음.
}

리플렉션 개선

  • 실제로 리플렉션 기술이 dynamic을 가능하게 하기 때문에, dynamic 예약어를 리플렉션의 간편 표기법 정도로 여겨도 무방하다.
  • 기존에는 직접 로드한 어셈블리 안에 있는 타입의 메서드를 호출하려면 리플렉션을 이용해야 했다.
  NewType variable;
  Type type = variable.GetType();
  MethodInfo methodInfo = type.GetMethod("MethodName");
  • dynamic을 활용하면 확장 모듈로부터 생성된 객체를 dynamic 변수에 담아 사전에 정의된 메서드의 이름으로 호출하기만 하면 된다.
   dynamic variable;
   variable.MethodName();

덕 타이핑

  • 둘 이상의 타입에서 동일한 이름으로 제공되는 속성 또는 메서드가 있을 때, 인터페이스나 상속을 이용하여 형식을 구현하지 않아도 dynamic을 통해 처리할 수 있다.
  • 덕 타이핑은 같은 이름의 속성이나 메서드가 있다면 그것을 기능적 관점에서 동일한 객체로 본다.
  • dynamic은 동적 언어에서 가능한 덕 타이핑을 정적 언어인 C#에서 가능하게 한다.

💡 샘플 코드

static void Main(string[] args)
{
	string str = "test executed";
	List <int> list = new List<int> { 1,2,3,4,5};
    
    Console.WriteLine(DuckTypingCall(str,"exe"));
    Console.WriteLine(DuckTypingCall(list,3));
}

static int DuckTypingCall(dynamic target, dynamic item)
{
	return target.IndexOf(item);
}

✅ 결과

5
2

동적 언어와의 타입 연동

  • dynamic을 통해 C#에서 파이썬 함수를 호출하거나, 파이썬에서 C# 메서드를 호출할 수 있다.

참고자료

정적 언어 vs 동적 언어
컴파일러 vs 인터프리터
정적 언어 = 컴파일러, 동적 언어 = 인터프리터인가?

0개의 댓글