C#

[C#] Dynamic 형식

Prooni 2024. 10. 15. 13:25

안녕하세요~

오늘은 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