성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<span> <br /> <div class='mainCenterTitle'>Lambda 표현식 - .NET에서의 해석</div><br /> <br /> 처음, C# 3.0 이야기를 주저리 주저리 읽어보면서 "Lambda"에 대한 지원 추가 부분을 보면서는, 단순히 anonymous 함수를 사용하는 방법에 따라 달리 불리는 하나의 "응용 예"라고만 생각했습니다. 적어도, 다음의 기사를 읽어보기 전까지는 쭈~~욱 그렇게만 알고 지냈었습니다.<br /> <br /> <pre class='code'> Lambda, Lambda, Lambda! ; http://blogs.msdn.com/howard_dierking/archive/2007/01/18/lambda-lambda-lambda.aspx ; <a target='tab' href='https://web.archive.org/web/20070224115433/http://blogs.msdn.com/howard_dierking/archive/2007/01/18/lambda-lambda-lambda.aspx'>https://web.archive.org/web/20070224115433/http://blogs.msdn.com/howard_dierking/archive/2007/01/18/lambda-lambda-lambda.aspx</a> </pre> <br /> 위의 기사에 나온 내용을 좀 추려볼까요? ^^<br /> <br /> 다음은 동일한 기능을 하는 것에 대한 다양한 표현을 보여주는 코드입니다.<br /> <br /> <pre class='code'> public class Person { public Person(int age) { Age = age; } public int Age; } // 표현 1: delegate 함수를 이용한 예 List<Person> oldPeople = people.FindAll(<b>ageGT10Filter</b>); <b>static bool ageGT10Filter(Person p) </b>{ return p.Age > 10; } // 표현 2: anonymous를 이용한 예 List<Person> oldPeople = people.FindAll(<b>delegate(Person p) { return p.Age > 10; }</b>); // 표현 3: Lambda 표현식을 이용한 예 List<Person> oldPeople = people.FindAll(<b>p => p.Age > 10</b>); </pre> <br /> 훨씬 간략한 표현식으로 동일한 기능을 구현해 주고 있습니다. 다소 생소한 "=>" 연산자가 있다는 것을 제외하면 식 자체는 오히려 직관적입니다.<br /> <br /> 요즘 잠깐씩 틈날 때마다(틈이 거의 안 납니다만. ^^;) 공부하고 있는 "Ruby"와 잠깐 비교를 해볼까요? ^^<br /> <br /> 루비는 "블록"이 이에 해당하는 것으로 알고 있습니다. 대강 사용예를 한번 보겠습니다.<br /> <br /> <pre class='code'> irb(main):001:0> <b>["howard", "jennifer", "hannah"].each { |str| puts str.reverse }</b> drawoh refinnej hannah => ["howard", "jennifer", "hannah"] irb(main):002:0> </pre> <br /> 문자열 배열을 "[", "]"에 지정하고, each 메서드를 호출하고 있으며 이후에는 블록 표현을 이용해서 코드를 실행하고 있습니다. 해당 블록의 인자로는 "|str|"이 사용된 것을 볼 수 있고요. 따라서, 루비를 공부해 보신 분들은 C#의 Lambda 표현식이 그다지 생소하게 느껴지지 않을 것입니다. 그럼, 위의 루비 코드를 C# 3.0으로 변환해 볼까요?<br /> <br /> <pre class='code'> string[] text = new string[] { "howard", "jennifer", "hannah" }; Array.ForEach(text, str => Console.WriteLine(str.<a target='_tab' href='/2/0/438'>Reverse</a>())); 또는, 조금 더 줄여서. Array.ForEach(new[] { "howard", "jennifer", "hannah" }, str => Console.WriteLine(str.Reverse())); </pre> <br /> 이제, "Lambda" 표현식이 좀 보이시나요? 왠지 한층 더 익숙해지신 것 같죠? ^^<br /> <br /> 그런데, "Lambda, Lambda, Lambda!" 토픽을 읽어보신 분들이라면, C#의 "Lambda" 표현식과 루비의 블록과는 다른 점이 있다는 것을 알게 됩니다.<br /> <br /> 바로, C#의 "Lambda" 표현식은 "코드"로도 동작할 수도 있고, "데이터"로도 다뤄질 수 있다는 좀 더 향상된 확장이 제공됩니다.<br /> <br /> 코드로 실행되는 경우는, 일반적인 delegate로 인자를 지정하게 되면 가능한 경우입니다. 그런데, 주어진 "Lambda" 표현식을 분해할 수 있는 기능도 제공하는데, 이를 위해 Expression Generic 클래스가 제공됩니다. 그 클래스를 사용하면, 주어진 "p.Age > 10" 표현식에 대해서, 다음과 같이 분석이 가능합니다.<br /> <br /> <pre class='code'> BinaryExpression.Left.NodeType == ExpressionType.MemberAccess "Age" == BinaryExpression.Left.Member.Name BinaryExpression.NodeType == ExpressionType.GreaterThan BinaryExpression.Right.NodeType == ExpressionType.Constant 10 == BinaryExpression.Right.Value </pre> <br /> C++을 공부하면서는,,, 언어의 발전이라는 것이 사실 그다지 와닿은 적이 없었는데 - 엄밀히, C++의 발전이라기보다는 컴파일러의 발전이었죠! 라이브러리의 발전이었고. - 반면에, C#에서는 시대에 맞게 발전하는 모습이 확연히 느껴지는군요. ^^ (그러고 보면... C++ 표준 관련한 사람들이 상당히 무신경했던 것이 아니냐는 느낌마저 드는군요.)<br /> <br /> <hr style='width: 50%' /> [내용추가: 2007-01-25]<br /> 참고로, 파라미터를 2개 이상 갖는 경우에는 다음과 같이 괄호와 쉼표를 사용해서 표현해 줄 수 있습니다.<br /> <pre class='code'> private void TestDlg_Load(object sender, EventArgs e) { // 이벤트 핸들러에 대한 Lambda 함수 정의 this.HandleCreated += (evtSender, evtArg) => { // 코드 }; } </pre> <br /><br /><hr /><span style='color: Maroon'>[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </span>
첨부파일
스팸 방지용 인증 번호
2106
(왼쪽의 숫자를 입력해야 합니다.)