C#/C# 기본

[C#] dynamic 타입

로파이 2021. 10. 19. 19:56

dynamic 

.NET과 COM과 같은 외부 API 그리고 다른 언어를 C#에서 실행할 때 사용할 수 있는 형식이다. 

 

dynamic의 기능

C#에서 제공하는 형식 검사를 dynamic 형식에 대해 수행하지 않는다. 대신 정상적으로 동적 실행 시간에 실행될 것이라고 기대하여 dynamic 타입을 지정한다.

class MyClass
{
	public void FuncA() {}
}

static void Main(string[] args)
{
    MyClass inst = new MyClass();
    inst.FuncA();
    inst.FuncB(); // Not OK
    
    dynamic inst2 = new MyClass();
    inst2.FuncA();
    inst2.FuncB(); // No Compile Error
}

dynamic으로 타입 지정한 인스턴스 inst2가 실제로 없는 메서드 FuncB()를 호출하고 있지만 컴파일러가 타입 검사를 하지 않기 때문에 컴파일이 된다. 하지만 실제로 실행을 하게되면 없는 메서드를 호출하고 있으므로 오류가 발생한다.

 

덕 타이핑

 

"오리처럼 걷고 오리처럼 헤엄치며 오리처럼 꽉깍 거리는 새를 봤을 때, 나는 그 새를 오리라고 부른다."

 

위는 덕 타이핑을 표현한 문장인데, 덕 타이핑은 개체지향 프로그래밍과는 반대되는 생각으로 타입(클래스)를 취급한다. 

    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("Robot.Walk"); }
        public void Swim() { Console.WriteLine("Robot.Swim"); }
        public void Quack() { Console.WriteLine("Robot.Quack"); }
    }

 Mallard는 Duck을 상속한 클래스로 오리(Duck)의 한 종류라고 볼 수 있다. 로봇(Robot)은 오리를 상속하지 않기 때문에 개체지향 프로그래밍에서 로봇은 Duck 타입으로 가리킬 수 없다.

Duck robotDuck = new Robot(); // 컴파일 에러

dynamic으로 지정한 타입은 덕 타이핑의 개념으로 볼 수 있다. Duck 클래스와 같이 Walk(), Swim(), Quack() 메서드를 가지고 있는 모든 클래스는 Duck처럼 취급할 수 있는 것이다. 

  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();
 }

 

dynamic 형식은 컴파일 시점에 타입에 대한 검사를 하지 않으므로 해당 메서드가 호출될 수 있는지 알 수 없다. 또한 VS IDE에서 제공하는 IntelliSense 기능이 적용되지 않아 dynamic 형식이 사용하는 메서드 이름에 사소한 타이핑 오류도 검사할 수 없다.

 

COM과 .NET의 호환을 가능하게하는 dynamic 형식

COM(Component Object Model)의 약자로 마이크로소프트의 소프트웨어 컴포넌트 규격을 말한다. 주로 하드웨어 장치를 다루는데 필요한 소프트웨어적 인터페이스를 제공하며 COM 클래스를 상속하여 구현하였다. 

C#을 비롯한 .NET에서는 RCW(Runtime Callable Wrapper)를 통해서 COM 개체를 사용할 수 있었다. RCW는 COM 개체와 .NET 클래스 라이브러리 사이의 프록시라고 볼 수 있다.

 

COM의 메서드를 사용하게 되면 반환되는 형식이 Object 타입이라 실제 형식으로 변환해야했던 번거로움이 있었는데 dynamic 형식이 형식 변환 없이 알고 있는 메서드를 호출하면 편하게 사용할 수 있게 되었다.

 

동적 언어와 호환을 가능하게 하는 dynamic 형식

https://docs.microsoft.com/ko-kr/dotnet/framework/reflection-and-codedom/dynamic-language-runtime-overview

.NET에서 제공하는 기능으로 python이나 ruby와 같이 컴파일 없이 실행하는 동적 언어를 C#에서 실행할 수 있게 해준다. 기존 CLR(Common Language Runtime) 환경 위에 DLR(Dynamic Language Runtime) 환경을 만들어주고 DLR 위에서 파이썬이나 루비와 같은 언어로 된 코드를 동적으로 실행하는 원리이다. CLR이 DLR API를 기반으로 구현된 동적 언어를 호스팅 구조이다.

'C# > C# 기본' 카테고리의 다른 글

[C#] 스레드  (0) 2021.10.21
[C#] 파일 입출력  (0) 2021.10.21
[C#] 리플렉션과 애트리뷰트  (0) 2021.10.19
[C#] LINQ  (0) 2021.10.18
[C#] 람다식  (0) 2021.10.15