일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 다트 언어
- 구조체
- docker
- C언어 포인터
- Algorithm
- 포인터
- git
- c#
- C++
- jupyter lab
- vim
- 유니티
- Data Structure
- github
- dart 언어
- jupyter
- c# 추상 클래스
- Unity
- c# 윈폼
- Houdini
- C# delegate
- c# winform
- Python
- c언어
- 도커
- HTML
- 플러터
- 깃
- gitlab
- Flutter
Archives
- Today
- Total
nomad-programmer
[Programming/C#] Lambda (익명 메소드) 본문
람다식(Lambda Expression) 은 무명 함수(Anonymous Function) 라는 이름으로 부른다.
// 기본적인 람다식 선언
매개변수목록 => 식
"=>" 연산자는 "입력" 연산자이다. 이 연산자가 하는 역할은 그저 매개 변수를 전달하는 것뿐이다. 람다식에서는 => 를 중심으로 왼쪽에는 매개 변수가 오른편에는 식이 위치한다.
// 익명 메소드를 위한 대리자 선언
delegate int Calculate(int a, int b);
// ...
static void Main(string[] args){
Calulate calc = (int a, int b) => a + b;
}
C# 컴파일러는 람다를 한층 더 간결하게 만들 수 있도록 "형식 유추(Type Inference)" 라는 기능을 제공한다. 형식 유추를 이용하면 람다식에서 매개 변수의 형식을 제거할 수 있다.
람다식의 예제
using System;
namespace test
{
// 익명 메소드를 만들기 위한 대리자 선언
delegate int Calculate(int a, int b);
internal class Program
{
public static void Main(string[] args)
{
// delegate를 이용한 익명 메소드
Calculate calc1 = delegate(int a, int b) { return a + b; };
Console.WriteLine(calc1(5, 5));
// lambda를 이용한 익명 메소드
Calculate calc2 = (a, b) => a + b;
Console.WriteLine(calc2(5, 7));
}
}
}
/* 결과
10
12
*/
람다식은 대리자보다 더 간결한다. 그렇다면 왜 MS에서는 익명 메소드를 만드는 방법을 더 번거로운 대리자와 편리한 람다식을 같이 제공하는 것일까? 이유인 즉슨, MS는 대리자를 이용한 익명 메소드를 C#2.0에 도입했다. 그리고 람다식은 C#3.0에서 도입되었다. 허나 이미 수많은 프로그램들이 C#2.0으로 작성되었는데 C#3.0이 나왔다고 해당 기능을 없애버릴 순 없으니 아직도 대리자를 이용한 익명 메소드가 남아 있는 것이다.
문 형식의 람다
람다식은 말 그대로 "식(Expression)" 형식을 하고 있다. 하지만 if(a == b) return 0; else return 1; 과 같은 문 형식의 문장을 사용할 수 있다. 그리고 이것을 "문 형식의 람다(Statement Lambda)"라고 부른다.
문 형식의 람다식은 => 연산자의 오른편에 식 대신 { } 로 둘러싸인 코드 블록이 위치한다.
(매개변수목록) => {
문장1;
문장2;
문장3;
...;
}
반환 형식이 없는 무명 함수는 람다식으로는 만들 수 없지만 문 형식의 람다식으로는 만들 수 있다.
delegate void DoSomething();
static void Main(string[] args){
DoSomething dosom = () => {
Console.WriteLine("hi!");
Console.WriteLine("C#");
}
dosom();
}
문 형식의 람다식 예제
using System;
namespace test
{
internal class Program
{
delegate string Concatenate(string[] args);
public static void Main(string[] args)
{
Concatenate concat = (arr) =>
{
string result = "";
foreach (string s in arr)
result += s;
return result;
};
Console.WriteLine(concat(new string[] {"aa", "bb", "cc", "dd"}));
}
}
}
/* 결과
aabbccdd
*/
'Programming > C#' 카테고리의 다른 글
[Programming/C#] Expression Tree (0) | 2020.09.24 |
---|---|
[Programming/C#] Func 대리자, Action 대리자 (0) | 2020.09.23 |
[Programming/C#] 이벤트 (Event) : 객체에 일어난 사건 알리기 (0) | 2020.09.23 |
[Programming/C#] delegate를 이용한 익명 메소드 (Anonymous Method) (0) | 2020.09.22 |
[Programming/C#] 대리자 체인 (0) | 2020.09.22 |
Comments