[.NET/C# 3.0] - 람다식(Lambda Expressions) 을 이용한 확장 메서드(Extension Methods) 만들기 [1]
[.NET/C# 3.0] - 람다식(Lambda Expressions) 을 이용한 확장 메서드(Extension Methods) 만들기 [2]
[.NET/C# 3.0] - 람다식(Lambda Expressions) 을 이용한 확장 메서드(Extension Methods) 만들기 [2]
지난 아티클에서 우리는 List<> 컬렉션에 특정 요소를 탐색하기 위해 delegate 와, 익명 메서드, 람다식을 이용한 방법을 알아보았다.
List<> 컬렉션의 Find와 FindAll 메서드는 List<> 클래스가 제공하는 메서드지만, 이와 비슷한 확장 메서드를 손수 구현해 보도록 할 것이다.
이번에도 다음의 List<> 컬렉션의 데이터를 가지고 예제를 만들어 볼 것이다.
List<int> arr = new List<int>();
arr.Add(1);
arr.Add(2);
arr.Add(3);
arr.Add(4); |
지난 강좌에서 보듯 다음과 같이 List<> 클래스의 Find 메서드를 이용하여 특정 요소를 탐색한다.
int result = arr.Find(o => o == 2);
Console.WriteLine(result); |
List<Int>.Find 메서드를 확장 메서드로 구현
확장 메서드를 구현하기 위해 MyExtension 이라는 클래스를 만들고 UmcFind 라는 메서드를 만들자.
static class MyExtension
{
public static int UmcFind(this IEnumerable<int> arr, Predicate<int> p)
{
List<int> ret = new List<int>();
foreach (var v in arr)
{
if (p(v))
return v;
}
return 0;
}
} |
위 확장 메서드는 다음과 같이 호출이 가능하다.
int result = arr.UmcFind(o => o == 2);
Console.WriteLine(result); |
Public static int UmcFind(this IEnumerable<int> arr, Predicate<int> p)
의 선언을 보자.
인자값에 오는 this 는 확장메서드를 지원할 원본 객체의 타입이다. 즉, 우리는 List<int> 에 대한 객체에만 확장 메서드를 지원하게 된다.
Predicate<Int> p
는 .NET Framework 에서 선언된 bool 을 리턴하는 델리게이트이다.
즉, o => o == 2 람다식의 “ o == 2 “ 의 구현부는 Predicate 델리게이트에게 위임된 것이다.
때문에,
if( p( v ) )
와 같이 Predicate 의 리턴이 bool 이므로 람다식의 조건을 True/False 로 리턴 받을 수 있다.
List<Int>.FindAll 메서드를 확장 메서드로 구현
아래와 같이 사용되는 List<int>.FindAll 메서드를 확장 메서드로 구현해 보자.
List<int> result = arr.FindAll(o => o >= 2 && o <= 3);
result.ForEach(o => Console.WriteLine(o)); |
이번에는 .NET Framework 가 제공하는 델리게이트를 사용하지 않고, 직접 델리게이트를 선언해 볼 것이다.
delegate TResult FindAllHandler<T, TResult>(T t); |
FindAll 확장 메서드를 구현하기 위해 제네릭 델리게이트를 선언해 보았다.
첫번째 T 는 받을 인자 타입이고, 두번째 TResult 는 리턴 타입이 된다.
그럼 UmcFindAll 이라는 확장 메서드를 만들어 보자.
static class MyExtension
{
public static List<int> UmcFindAll(
this IEnumerable<int> arr, FindAllHandler<int,bool> p)
{
List<int> result = new List<int>();
foreach (var v in arr)
{
if( p(v) )
result.Add( v );
}
return result;
}
} |
위의 확장 메서드는 다음 처럼 사용이 가능하다.
List<int> list = arr.UmcFindAll(o => o >= 2 && o <= 3);
list.ForEach(o => Console.WriteLine(o)); |
보시는 바와 같이 List<> 클래스가 제공하는 FindAll 메서드와 동일한 기능을 하는 확장 메서드를 만들어보았다.
UmcFindAll 확장 메서드는 제네릭 델리게이트를 선언하여 예제를 만들어 보았지만, UmcFind 확장메서드를 유심히 본 독자라면 보는데 큰 어려움이 없을 것 같다.
이것으로. 람다식의 간략한 이용 방법과 람다식을 사용하는 확장 메서드에 대해서 알아 보았다.
'.NET > C#' 카테고리의 다른 글
LINQ To Sql 의 올바른 사용 (0) | 2007.09.17 |
---|---|
확장 메서드의 설계(Architect) (0) | 2007.09.12 |
람다식(Lambda Expressions) 을 이용한 확장 메서드(Extension Methods) 만들기 [2] (1) | 2007.09.09 |
람다식(Lambda Expressions) 을 이용한 확장 메서드(Extension Methods) 만들기 [1] (1) | 2007.09.08 |
LINQ 의 OUTER JOIN 작업 (0) | 2007.09.04 |
LINQ to SQL Classes 와 LINQ의 JOIN 작업 (2) | 2007.09.04 |