안녕하세요~
오늘은 C# Dynamic 형식에 대해 공부해요!
Dynamic 형식도 데이터 형식이에요.
다만 형식 검사를 하는 시점이 프로그램 실행 중이라는 점이 달라요.
컴파일러는 dynamic 키워드를 만나면
프로그램을 실행할 때 형식 검사를 하도록 미뤄요
덕 타이핑
"오리처럼 걷고 오리처럼 헤엄치며 오리처럼 꽉꽉거리는 새를 봤을 때, 나는 그 새를 오리라고 부른다."
상속을 받지 않는다면
아무리 같은 메소드를 가지고 있더라도
컴파일러는 다른 형식으로 인식할거에요.
하지만 dynamic 형식으로 선언한 경우
형식 검사를 실행할 때로 미루기 때문에
같은 형식처럼 사용할 수 있답니다.
예제코드 첨부할게요.
class Duck
{
public void Walk()
{
Console.WriteLine(this.GetType() + ".Walk");
}
public void Swim()
{
Console.WriteLine(this.GetType() + ".Swim");
}
public void Quack()
{
Console.WriteLine(this.GetType() + ".Quack");
}
}
class Mallard : Duck
{ }
class Robot
{
public void Walk()
{
Console.WriteLine(this.GetType() + ".Walk");
}
public void Swim()
{
Console.WriteLine(this.GetType() + ".Swim");
}
public void Quack()
{
Console.WriteLine(this.GetType() + ".Quack");
}
}
class MainApp
{
static void Main(string[] args)
{
dynamic[] arr = new dynamic[] { new Duck(), new Mallard(), new Robot() };
foreach (dynamic duck in arr)
{
Console.WriteLine(duck.GetType());
duck.Walk();
duck.Swim();
duck.Quack();
Console.WriteLine();
}
}
}
COM과 .NET 사이의 상호 운용성을 위한 Dynamic
COM이란?
COM은 Component Object Model의 약자로, 마이크로소프트의 소프트웨어 컴포넌트 규격을 말해요
COM 컴포넌트는 그래픽 프로그래밍에 서툰 프로그래머가
화려한 차트 기능을 앱에 넣을 수 있게 해주고
엑셀 문서의 파일 구조를 몰라도
엑셀 문서를 읽거나 쓸 수 있게 해줘요.
동적언어와의 상호 운용성을 위한 dynamic 형식
마이크로소프트는 동적 언어를 실행할 수 있도록 하는 플랫폼인
DLR(Dynamic Laguage Runtime)을 선보였어요
DLR은 CLR 위에서 동작하고 동적언어를 실행하고
동적언어의 코드로 만들어진 객체에
C#이나 VB같은 정적 언어의 코드에서 접근할 수 있게 해줘요.
아래는 C# 코드에서 동적 언어를 호스팅하기 위해 도움을 받는
클래스들이에요.
| ScriptRuntime | 동적 언어를 호스팅하는 시작점입니다. ScriptRuntime 클래스는 참조된 어셈블리나 전역 객체 같은 전역 상태를 나타내며 하나의 .NET AppDomain 안에 여러 개의 ScriptRuntime 인스턴스를 만들 수 있습니다. |
| ScriptScope | 기본적으로 네임스페이스를 나타냅니다. 호스트(C# 코드)는 ScriptScope 객체 안 동적 언어 코드에서 사용하는 변수에 값을 대입하거나 읽을 수 있습니다. |
| ScriptEngine | 스크립트 엔진은 언어의 구문을 나타내는 일꾼입니다. 스크랩트 엔진은 코드를 실행하고 ScriptScope와 ScriptSource를 생성하는 다양한 방법을 제공합니다. |
| ScriptSource | 이 클래스는 소스 코드를 읽어들이는 여러 메소드와 읽어들인 소스 코드를 다양한 방법으로 실행하는 메소드들을 제공합니다. |
| CompiledCode | 이 클래스는 컴파일된 코드를 나타냅니다. 한 번 컴파일해놓고 여러 번 반복해서 실행하는 코드를 나타내는 데 사용합니다. |
예제코드 추가할게요.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
using IronPython.Hosting;
namespace WithPython
{
class MainApp
{
static void Main(string[] args)
{
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
scope.SetVariable("n", "박상현");
scope.SetVariable("p", "010-123-4566");
ScriptSource source = engine.CreateScriptSourceFromString(
@"
class NameCard :
name = ''
phone = ''
def __init__(self, name, phone) :
self.name = name
self.phone = phone
def printNameCard(self) :
print (self.name + ',' + self.phone)
NameCard(n, p)
");
dynamic result = source.Execute(scope);
result.printNameCard();
Console.WriteLine("{0} {1}", result.name, result.phone);
}
}
}
'C#' 카테고리의 다른 글
| [C#] 직렬화 역직렬화 (0) | 2024.10.16 |
|---|---|
| [C#] 파일 다루기 (0) | 2024.10.16 |
| [C#] 리플렉션과 애트리뷰트 (1) | 2024.10.14 |
| [C#] LINQ (1) | 2024.10.13 |
| [C#] 식 트리 (Expression Tree) (0) | 2024.10.11 |