LINQ

쇼트컷 시리즈 (Lambda Expression)

손병환 2008. 10. 10. 18:08

참조 : 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 (타입 추론)에 대해서 썰을 풀어보자.