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 형식
.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 |