쇼트컷 시리즈 (Lambda Expression)
참조 :
LINQ: The Future of Data Access in C# 3.0
책 구매는
-> http://oreilly.com/catalog/9780596528416/
소스 다운은
-> http://examples.oreilly.com/language1/
이번에 썰을 풀어볼 Lambda
expression의 경우는 앞에서 이야기 했던 anonymous method(http://blog.daum.net/sonstein/15696002)와 아주 아주 밀접한 관련이 있다. 쉽게
말하자면 anonymous method를 수학적인 방법으로 풀어놓은 것이다. 수학을 아주 싫어하는 분들도 함수에 대해서는 알고 있을 것이다. Y =
F(X)라는 수식.
List<Doctor> inchicago =
doctors.FindAll(delegate(Doctor d)
{
return
d.City == "Chicago";
});
위의 코드에서 리턴값인 True/False에
대한 부분은 Y에 해당하고 실질적인 함수에 대한 부분인 F(X)의
경우는 아래의 코드를 나타낸다.
delegate(Doctor d)
{
return
d.City == "Chicago";
}
여기서 X에 대한 부분은 Doctor의 변수에 해당하는 d일 것이다.
이러한 전제를 가지고 Lambda expression을
좀 더 쉽게 이해할 수 있을 것이다.
일반적으로 Lambda expression은
아래와 같은 수식으로 표현한다.
x => f(x)
위의 수식을 근거로 C# 3.0에서는
이전에 FindAll(http://blog.daum.net/sonstein/15696002)함수에 대해서 좀 더 간단하게 표현하는 것이 가능하다.
List<Doctor> inchicago =
doctors.FindAll(x => x.City == "Chicago");
어라 이게 정말 컴파일 되는거야? 라고
생각하는 사람들이 다수 있을 것이다. 사실 위의 코드만으로는 컴파일이 되지 않는다. 당연한 이야기지만 x에 대해서 이렇다 할 선언이 되어 있지 않기
때문에 컴파일을 하면 에러가 발생한다. (컴파일 이전에 빨간줄이 쫙 그어져 있을 것이다.)
List<Doctor> inchicago =
doctors.FindAll(d => d.City == "Chicago");
위의 x 대신에 d로 대체 되었다. 즉 x는 Doctor에 대한 부분이고 d.City == “Chicago”는 f(x)를 나타내게 되는 것이다.
위의 코드는 컴파일이 된다. 무지한
나는 정말 가능한지 직접 코드를 컴파일하고 실행해 보고나서야 가능하다는 것을 알게 되었고 Lambda
expression에 대해서 어렴풋이나마 개념을 잡고 이해를 할 수 있게 되었다.
끝으로 아래의 라인이 컴파일이 되면 과연 어떠한 형태로 변형이 될까? ^^
List<Doctor> inchicago =
doctors.FindAll(d => d.City == "Chicago");
Lambda expression이 anonymous method와
동일하다는 부분에 대해서 위에서 설명을 잘 보았다면 아마도 쉽게 답을 알 수 있을 것이다. 즉, 유니크한 메소드로 변형이 될 것이다.
Lambda expression => anonymous method => 델리게이션을 이용한 유니크한 함수
다음 시간에는 Type Inference
(타입 추론)에 대해서 썰을 풀어보자.