... | @@ -3,10 +3,9 @@ |
... | @@ -3,10 +3,9 @@ |
|
method를 가리킬 수 있는 type.
|
|
method를 가리킬 수 있는 type.
|
|
|
|
|
|
* **Delegate 문법**
|
|
* **Delegate 문법**
|
|
>접근제한자 delegate method의_return_type 식별자(.....method의_parameter목록.....);
|
|
>접근제한자 `delegate_method의_return_type` 식별자(.....method의_parameter목록.....);
|
|
|
|
|
|
`int Clean (object);`를 delegate type로 정의하면 `delegate int FuncDelegate(Object arg);`와 같다.
|
|
`int Clean (object);`를 delegate type로 정의하면 `delegate int FuncDelegate(Object arg);`와 같다. delegate object를 생성할 때 delegate에 wrapping되는 method의 이름 또는 anonymous Method를 통해 생성된다. 인스턴스화된 delegate는 object이므로 parameter 또는 property로 할당할 수 있다.
|
|
delegate object를 생성할 때 delegate에 wrapping되는 method의 이름 또는 anonymous Method를 통해 생성된다. 인스턴스화된 delegate는 object이므로 parameter 또는 property로 할당할 수 있다.
|
|
|
|
``` cs
|
|
``` cs
|
|
class Test
|
|
class Test
|
|
{
|
|
{
|
... | @@ -31,8 +30,8 @@ delegate object를 생성할 때 delegate에 wrapping되는 method의 이름 또 |
... | @@ -31,8 +30,8 @@ delegate object를 생성할 때 delegate에 wrapping되는 method의 이름 또 |
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
```
|
|
* **Delegate 체인**
|
|
* **Delegate chain**
|
|
delegate의 가장 강력한 속성은 여러 method들의 chain을 담을 수 있는 delegate이다. method들의 "chain"은 delegate가 invoke될 때 호출된다. 대부분 .NET language에서 delegate chain은 BCL library의 Delegateclass의 Combine() method에 의해 생성된다. 그러나 C#에서는 +operator가 overload해주기 때문에 delegate chain을 문법적으로 더 깔끔하게 생성할 수 있다. -operator는 delegate chain으로부터 해당 method를 제거한다.
|
|
delegate의 가장 강력한 속성은 여러 method들의 chain을 담을 수 있는 delegate이다. method들의 chain은 delegate가 invoke될 때 호출된다. 대부분 .NET language에서 delegate chain은 BCL library의 Delegateclass의 Combine() method에 의해 생성된다. 그러나 C#에서는 +operator가 overload해주기 때문에 delegate chain을 문법적으로 더 깔끔하게 생성할 수 있다. -operator는 delegate chain으로부터 해당 method를 제거한다.
|
|
``` cs
|
|
``` cs
|
|
using System;
|
|
using System;
|
|
|
|
|
... | @@ -101,22 +100,12 @@ delegate의 가장 강력한 속성은 여러 method들의 chain을 담을 수 |
... | @@ -101,22 +100,12 @@ delegate의 가장 강력한 속성은 여러 method들의 chain을 담을 수 |
|
```
|
|
```
|
|
delegate chain 생성 시 원한다면 Chain()이나 Combine() method를 사용해도 된다. 사실상 +operator를 사용했을 때 C# compiler가 내부적으로 Chain, Combine method를 호출하기 때문이다.
|
|
delegate chain 생성 시 원한다면 Chain()이나 Combine() method를 사용해도 된다. 사실상 +operator를 사용했을 때 C# compiler가 내부적으로 Chain, Combine method를 호출하기 때문이다.
|
|
|
|
|
|
* Event and Delegates
|
|
* **Event and Delegate**
|
|
event와 delegate는 component가 비동기적으로 중요한일이 발생한 client를 알리는 것을 허락한다. delegate가 흥미로운 것은 .NET Framework에서 delegate가 event 배후의 근본적인 architecture이다. class가 event를 노출시킬 때 실제로 delegate callback mechanism을 사용한다. 이다. 더 나아가서 VB.NET 뭉 JScript abstract C# abstraction을 제공하지 않는다. event를 노출시키기 위해서 두가지 concept의 결합을 사용해야 한다.
|
|
event와 delegate는 component가 비동기적으로 중요한 일이 발생한 client를 알리는 것을 허락한다. delegate가 흥미로운 것은 .NET Framework에서 delegate가 event 배후의 근본적인 architecture이다. class가 event를 노출시킬 때 실제로 delegate callback mechanism을 사용한다. event 개념은 delegate의 asynchronous 속성과 밀접한 관련이 있다.
|
|
event 개념은 delegate의 asynchronous 속성과 밀접한 관련이 있다.
|
|
|
|
|
|
|
|
* **Responding to a button click in Visual Basic 6**
|
|
|
|
``` vb
|
|
|
|
Private Sub Button1_Click()
|
|
|
|
MsgBox("Button was clicked.")
|
|
|
|
End Sub
|
|
|
|
```
|
|
|
|
Button1_Click은 button click event를 다룬다고 해서 event handler라 부른다.
|
|
|
|
|
|
|
|
C#에서 event는 event keyword에
|
|
|
|
## **2. Event**
|
|
## **2. Event**
|
|
* **Event 정의**
|
|
* **Event 정의**
|
|
event도 간편표기법중의 하나인데, 다음 조건을 만족하는 정형화된 callback 패턴을 구현하려고 할 때 event keyword를 사용하면 코드를 줄일 수 있다.
|
|
event도 간편표기법 중의 하나인데, 다음 조건을 만족하는 정형화된 callback 패턴을 구현하려고 할 때 event keyword를 사용하면 코드를 줄일 수 있다.
|
|
|
|
|
|
1. class에서 event(callback)을 제공한다.
|
|
1. class에서 event(callback)을 제공한다.
|
|
2. 외부에서 자유롭게 해당 event(callback)를 구독하거나 해지하는 것이 가능하다.
|
|
2. 외부에서 자유롭게 해당 event(callback)를 구독하거나 해지하는 것이 가능하다.
|
... | @@ -183,12 +172,15 @@ event도 간편표기법중의 하나인데, 다음 조건을 만족하는 정 |
... | @@ -183,12 +172,15 @@ event도 간편표기법중의 하나인데, 다음 조건을 만족하는 정 |
|
|
|
|
|
## **3. 람다식**
|
|
## **3. 람다식**
|
|
* **람다식 용도**
|
|
* **람다식 용도**
|
|
|
|
|
|
1. 코드로서의 람다 식
|
|
1. 코드로서의 람다 식
|
|
anonymous method의 간편 표기 용도로 사용된다.
|
|
anonymous method의 간편 표기 용도로 사용된다.
|
|
|
|
|
|
2. 데이터로서의 람다 식
|
|
2. 데이터로서의 람다 식
|
|
람다 식 자체가 데이터가 되어 구문 분석의 대상이 된다. 이 람다식은 별도로 컴파일 할 수 있으며, 그렇게 되면 method로도 실행할 수 있다.
|
|
람다 식 자체가 데이터가 되어 구문 분석의 대상이 된다. 이 람다식은 별도로 컴파일 할 수 있으며, 그렇게 되면 method로도 실행할 수 있다.
|
|
|
|
|
|
* **람다식 용법**
|
|
* **람다식 용법**
|
|
|
|
|
|
1. 코드로서의 람다 식
|
|
1. 코드로서의 람다 식
|
|
``` cs
|
|
``` cs
|
|
Thread thread = new Thread{
|
|
Thread thread = new Thread{
|
... | @@ -223,52 +215,22 @@ class Program |
... | @@ -223,52 +215,22 @@ class Program |
|
}
|
|
}
|
|
```
|
|
```
|
|
|
|
|
|
다음과 같이 anonymous method를 람다 식으로 간편 표기할 수도 있다.
|
|
* **람다 식을 위한 전용 delegate :**람다 식은 기존 method와 달리 일회성으로 사용되는 간단한 코드를 표현할 때 사용되는데, 정작 그러한 목적으로 delegate를 일일이 정의해야한다는 불편함이 발생한다. 마이크로소프트에서는 이러한 불편을 덜기 위해 자주 사용되는 delegate형식을 generic의 도움으로 일반화해서 BCL에 Action, Func로 포함시켰다.
|
|
|
|
`// return값이 없는 delegate로 입력될 parameter 1개의 type을 지정`
|
|
``` cs
|
|
`public delegate void Action<T>(T arg);`
|
|
using System;
|
|
`public delegate void Action<T1, T2>(T arg1, T arg2);`
|
|
|
|
|
|
class Program
|
|
|
|
{
|
|
|
|
delegate int? MyDivide(int a, int b);
|
|
|
|
|
|
|
|
static void Main(string[] args)
|
|
|
|
{
|
|
|
|
MyDivide myFunc = (a, b) =>
|
|
|
|
{
|
|
|
|
if (b == 0)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return a / b;
|
|
|
|
};
|
|
|
|
|
|
|
|
Console.WriteLine("10 / 2 == " + myFunc(10, 2));
|
|
|
|
Console.WriteLine("10 / 2 == " + myFunc(10, 0));
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
* **람다 식을 위한 전용 delegate : **람다 식은 기존 method와 달리 일회성으로 사용되는 간단한 코드를 표현할 때 사용되는데, 정작 그러한 목적으로 delegate를 일일이 정의해야한다는 불편함이 발생한다. 마이크로소프트에서는 이러한 불편을 덜기 위해 자주 사용되는 delegate형식을 generic의 도움으로 일반화해서 BCL에 Action, Func로 포함시켰다.
|
|
|
|
`// return값이 없는 delegate로 입력될 parameter 1개의 type을 지정`
|
|
|
|
`public delegate void Action<T>(T arg);`
|
|
|
|
`public delegate void Action<T1, T2>(T arg1, T arg2);`
|
|
|
|
`public delegate void Action<T1, T2, T3>(T arg1, T arg2, T arg3);`
|
|
`public delegate void Action<T1, T2, T3>(T arg1, T arg2, T arg3);`
|
|
|
|
|
|
`// return값이 있는 delegate로 TResult 형식 parameter는 반환될 타입을 지정`
|
|
`// return값이 있는 delegate로 TResult 형식 parameter는 반환될 타입을 지정`
|
|
`public delegate TResult Func<TResult>();`
|
|
`public delegate TResult Func<TResult>();`
|
|
`public delegate TResult Func<T, TResult>(T arg);`
|
|
`public delegate TResult Func<T, TResult>(T arg);`
|
|
`public delegate TResult Func<T1, T2, TResult>(T arg1, T arg2);`
|
|
`public delegate TResult Func<T1, T2, TResult>(T arg1, T arg2);`
|
|
|
|
|
|
`[생략 : T1 ~ T16까지 Action, Func delegate 정의]`
|
|
`[생략 : T1 ~ T16까지 Action, Func delegate 정의]`
|
|
* **collection과 람다 식**
|
|
|
|
> **yield return/break**
|
|
|
|
> yield return/break keyword를 사용하면기존의 IEnumerable, IEnumerator interface를 이용해 구현했던 열거 기능을 쉽게 구현할 수 있다.
|
|
|
|
|
|
|
|
* **람다식으로 Event를 구현하기**
|
|
* **collection과 람다 식**
|
|
Event의 [Event 사용법](#first)예제에서 callback method 부분을 아래와 같이 lamda 식을 사용해서 구현할 수 있다.
|
|
* **람다식으로 Event를 구현하기**
|
|
|
|
Event의 [Event 사용법](#first)예제에서 callback method 부분을 아래와 같이 람다 식을 사용해서 구현할 수 있다.
|
|
```cs
|
|
```cs
|
|
class Program
|
|
class Program
|
|
{
|
|
{
|
... | | ... | |