|
|
# 1. Delegate
|
|
|
__Delegate 정의__
|
|
|
### Delegate 정의
|
|
|
|
|
|
***델리게이트(Delegate)***는 대리자로 해석되며, 메서드를 가리킬 수 있는 타입으로 메서드를 대신 실행해주는 역할을 한다.
|
|
|
`delegate` 예약어를 사용하여 타입을 선언한다.
|
|
|
|
|
|
__Delegate 문법__
|
|
|
### Delegate 문법
|
|
|
|
|
|
```csharp
|
|
|
public delegate int CalcDelegate(int x, int y);
|
|
|
// 대상 메서드의 반환 타입 및 매개변수 목록과 일치하는 델리게이트 타입을 정의
|
|
|
```
|
|
|
__Delegate 속성__
|
|
|
### Delegate 속성
|
|
|
|
|
|
- Delegate는 C++의 함수 포인터와 유사하지만 형식이 안전(type-safety)하다.
|
|
|
- Delegate를 통해 메서드를 매개 변수로 전달할 수 있다.
|
... | ... | @@ -21,7 +21,7 @@ __Delegate 속성__ |
|
|
형식 안전성(type-safety) : 어떠한 연산이 예측 불가능한 결과는 내지 않는 것.
|
|
|
형식 안전성이 보장되지 않는 언어는 예측 불가능한 결과를 내게 된다.
|
|
|
|
|
|
__Delegate 체인__
|
|
|
### Delegate 체인
|
|
|
|
|
|
Delegate를 여러개 연결해서 사용하는 방식이다.
|
|
|
연결된 Delegate는 내부 리스트에 저장되며 차례대로 호출되고 예외 발생시 중단된다.
|
... | ... | @@ -56,7 +56,7 @@ class Program |
|
|
```
|
|
|
|
|
|
# 2. Event
|
|
|
__Event 정의__
|
|
|
### Event 정의
|
|
|
|
|
|
`event`는 정형화된 콜백 패턴 구현을 위해 사용되는 delegate의 간편 표기법이다.
|
|
|
|
... | ... | @@ -66,14 +66,14 @@ __Event 정의__ |
|
|
|
|
|
이는 개발자의 실수를 방지하고, delegate 포함하는 클래스를 통해 delegate를 호출하므로써 외부 클래스가 이벤트를 발생시키는 것을 방지할 수 있다.
|
|
|
|
|
|
__Event 문법__
|
|
|
### Event 문법
|
|
|
|
|
|
```csharp
|
|
|
public event EventHandler onChange;
|
|
|
// 클래스의 멤버로 정의.
|
|
|
```
|
|
|
|
|
|
__Event 사용법__
|
|
|
### Event 사용법
|
|
|
|
|
|
```csharp
|
|
|
delegate void eventDelegate();
|
... | ... | @@ -110,13 +110,13 @@ class Program |
|
|
```
|
|
|
|
|
|
# 3. 람다식
|
|
|
***람다 식(Lambda Expression)***은 람다 대수(축약 함수)의 형식을 C#에서 구현한 문법이다.
|
|
|
람다 식(Lambda Expression)***은 람다 대수(축약 함수)의 형식을 C#에서 구현한 문법이다.
|
|
|
|
|
|
__람다식 용도__
|
|
|
### 람다식 용도
|
|
|
|
|
|
익명 메서드의 간편 표기와, Expression Tree를 이용한 구문 분석 용도로 사용된다.
|
|
|
|
|
|
__람다식 용법__
|
|
|
### 람다식 용법
|
|
|
|
|
|
```csharp
|
|
|
// 익명 메서드
|
... | ... | @@ -136,7 +136,7 @@ list.ForEach((elem) => { Console.WriteLine(elem + " * 2 == " + (elem * 2)); }); |
|
|
int count = list.Count((elem) => elem > 3);
|
|
|
```
|
|
|
|
|
|
__람다식으로 Event를 구현하기__
|
|
|
### 람다식으로 Event를 구현하기
|
|
|
```csharp
|
|
|
delegate void eventDelegate();
|
|
|
|
... | ... | @@ -165,7 +165,7 @@ class Program |
|
|
|
|
|
# 4. 확장 메소드 조사
|
|
|
|
|
|
__FirstOrDefault()__
|
|
|
### FirstOrDefault
|
|
|
|
|
|
조건에 맞는 데이터중 첫번째 행을 반환한다.
|
|
|
NULL 반환에 대한 처리해주어야 한다.
|
... | ... | @@ -182,7 +182,7 @@ if (firstMonth1 == 0) |
|
|
Console.WriteLine("The value of the firstMonth1 variable is {0}", firstMonth1);
|
|
|
```
|
|
|
|
|
|
__Where()__
|
|
|
### Where
|
|
|
|
|
|
특정 조건을 만족하는 요소를 IEnumerable<T>로 열거형을 반환한다.
|
|
|
|
... | ... | @@ -192,7 +192,7 @@ IEnumerable<int> enumList = list.Where((elem) => elem % 2 == 0); |
|
|
Array.ForEach(enumList.ToArray(), (elem) => { Console.WriteLine(elem); });
|
|
|
```
|
|
|
|
|
|
__Select()__
|
|
|
### Select
|
|
|
|
|
|
특정 요소를 IEnumerable<T>로 열거형을 반환한다.
|
|
|
개별 요소를 다른 타입으로 변환할 때 사용할 수 있다.
|
... | ... | @@ -288,7 +288,7 @@ int numCount2 = numbersQuery.Count(); |
|
|
***
|
|
|
***
|
|
|
|
|
|
#### Expression Trees (ETs)
|
|
|
### Expression Trees (ETs)
|
|
|
|
|
|
Expression 객체의 인스턴스 데이터의 역할을 하는 람다 식.
|
|
|
|
... | ... | @@ -307,25 +307,24 @@ Expression.Compile : 데이터로 담겨 있는 람다 식은 컴파일이 가 |
|
|
참고 : ExpressionTreeVisualizer (http://msdn.microsoft.com/ko-kr/library/bb397975(v=vs.90).aspx)
|
|
|
- Body : expression의 몸체를 리턴한다.
|
|
|
- Parameters : 람다식의 파라미터를 리턴한다.
|
|
|
- NodeType : Expression tree의 특정노드의 ExpressionType을 리턴한다. ExpressionType은 45가지의 값을 가진 열거형타입인데, Expression tree에 속할 수 있는 모든 노드의 목록이 포함되어 있다. 예를 들면, 상수를 리턴하거나, 파라미터를 리턴한다거나, 둘 중에 뭐가 더 큰지 결정한다거나 (<,>), 두 값을 더한다거나(+) 하는 것들이 있다.
|
|
|
- Type : expression의 정적인 타입을 리턴한다.
|
|
|
- NodeType : Expression tree의 특정노드의 ExpressionType을 리턴한다. ExpressionType은 45가지의 값을 가진 열거형타입인데,
|
|
|
|
|
|
#### LINQ
|
|
|
Expression tree에 속할 수 있는 모든 노드의 목록이 포함되어 있다. 예를 들면, 상수를 리턴하거나, 파라미터를 리턴한다거나, 둘 중에 뭐가 더 큰지 결정한다거나 (<,>), 두 값을 더한다거나(+) 하는 것들이 있다.
|
|
|
- Type : expression의 정적인 타입을 리턴한다.
|
|
|
|
|
|
### LINQ
|
|
|
C# 목표중에서 하나는 데이터베이스의 접속 및 제어 방식이 언어 자체에 잘 녹아들도록 만드는 것, MS는 사용자가 직접적인 데이터엑세스
|
|
|
서비스를 추가하지 않아도 C#의 구문 자체에서 데이터를 제어하길 원함.LINQ(Language Integrated Query)가 탄생함.
|
|
|
|
|
|
언어에 통합된 쿼리표현식(Query Expressions)
|
|
|
함수형 언어 개념을 도입하여 쿼리 형태의 표현식을 제공하여 데이터 추출과 연산에 추상화 단계 굉장히 높힌 표현식.
|
|
|
|
|
|
LINQ를 통해 데이터를 가져오는 방법
|
|
|
|
|
|
1) Select, First 같은 메서드에 람다식을 조합해서 사용
|
|
|
|
|
|
2) 쿼리 구문을 통해서 가져오는 방법 (쿼리 표현식은 데이터를 어떻게 가져오는지 좀 더 명확하고 구체적으로 설명해주는 장점이 있음, SQL 쿼리와 흡사)
|
|
|
### LINQ를 통해 데이터를 가져오는 방법
|
|
|
- Select, First 같은 메서드에 람다식을 조합해서 사용
|
|
|
- 쿼리 구문을 통해서 가져오는 방법 (쿼리 표현식은 데이터를 어떻게 가져오는지 좀 더 명확하고 구체적으로 설명해주는 장점이 있음, SQL 쿼리와 흡사)
|
|
|
|
|
|
|
|
|
__LINQ의 종류__
|
|
|
### LINQ의 종류
|
|
|
|
|
|
- LINQ to Object
|
|
|
- LINQ to SQL
|
... | ... | @@ -334,7 +333,7 @@ __LINQ의 종류__ |
|
|
- LINQ to XML
|
|
|
- ...
|
|
|
|
|
|
__Expression tree와 LINQ의 관계__
|
|
|
### Expression tree와 LINQ의 관계
|
|
|
LINQ to SQL의 경우 쿼리 표현식으로 데이터를 얻을 경우
|
|
|
반환 타입이 IQueryable이다.
|
|
|
|
... | ... | |