... | ... | @@ -38,7 +38,7 @@ p.Output(name: "Tom"); |
|
|
|
|
|
## : dynamic 예약어
|
|
|
`dynamic`은 프로그램 실행 시에 결정되는 동적 타입이다.
|
|
|
|
|
|
동적 타입은 실행 중에 다른 타입의 객체와도 연결이 가능한 타입을 말한다.
|
|
|
|
|
|
```csharp
|
|
|
class Program
|
... | ... | @@ -53,6 +53,33 @@ class Program |
|
|
}
|
|
|
}
|
|
|
```
|
|
|
|
|
|
### 덕타이핑 (duck typeing)
|
|
|
'오리의 한 종류인지 검사하지 않고 오리처럼 꽥꽥하는지, 오리처럼 걷는지 등등 오리가 하는 행동들을 할 수 있는지 검사한다'는 의미
|
|
|
|
|
|
일반적으로 객체지향 언어에서는 강력한 형식(Strong type)이 적용돼 있어 무조건 타입을 가지고 판단한다.
|
|
|
|
|
|
함수에 매개변수로 넘기는 상황에서 파라미터에 명시된 타입이 일치하던가, 그 타입을 상속한 타입이어야만 가능하다.
|
|
|
|
|
|
하지만 덕 타이핑은 객체의 타입으로 판단하지 않고, 객체가 무엇을 할 수 있는지를 보고 판단한다.
|
|
|
|
|
|
```csharp
|
|
|
int DuckTypingCall(dynamic target, dynamic item)
|
|
|
{
|
|
|
return target.IndexOf(item);
|
|
|
}
|
|
|
|
|
|
string txt = "test func"
|
|
|
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
|
|
|
|
|
|
Console.WriteLine(DuckTypingCall(txt, "test")); // 0
|
|
|
Console.WriteLine(DuckTypingCall(list, 3)); // 2
|
|
|
```
|
|
|
동적 타입은 컴파일 타임에 메타데이터를 가지지 않기 때문에 컴파일러는 특정 호출이 적절한지 아닌지를 판단할 수가 없다.
|
|
|
|
|
|
따라서 위 예제는 문제없이 컴파일되고 실행중에 문제가 생기면 런타임에러를 발생시킨다.
|
|
|
|
|
|
|
|
|
# C# 5.0
|
|
|
|
|
|
## 호출자 정보
|
... | ... | |