선언 연산자(=>)를 사용해 익명 함수를 만드는 식
JavaScript의 화살표 함수의 원조가 되는 식이다.
namespace 동적타입
{
internal class Program
{
static void Main(string[] args)
{
var python = Python.CreateEngine();
var scope = python.CreateScope();
string script = @"
def calcsum(n):
sum = 0
for num in range(n+1):
sum = sum + num
return sum
";
python.Execute(script, scope);
dynamic cal = scope.GetVariable("calcsum");
int sum = cal(10);
Console.WriteLine(sum);
}
}
}
<<결과값>>
55
와 같이 C#에서 파이썬의 함수를 사용하기 위해서는 scope를 사용해주어야 한다.
이렇게 되면 입력한 인수의 값에 대한 계산은 파이썬이 하게 되고, 해당 함수를 dynamic cal로 호출하여 결과값을 출력할 수 있다.
위 코드에서 보면 int나 string은 명확한 타입이 선언되어 있다. 하지만 var와 같은 타입은 명확히 정수인지, 실수인지, 문자열인지를 선언한 것이 아닌 자바스크립트와 같이 변수에 들어오는 데이터에 따라 타입이 결정되는 variable type이다. 이러한 타입을 "암묵적 타입"이라고 한다.
이러한 타입을 사용하는 이유는 설명한 바와 같이 어떠한 데이터 타입이 들어올 지 알 수 없는 경우(데이터를 외부에서 가져오는 경우)에 주로 사용한다.
익명 메소드: 함수의 이름이 존재하지 않는 메소드(함수)로, 콜백함수라고도 함.
함수의 이름이 없는 이유는 해당 이벤트에서만 사용하고, 그 외의 상황에서 호출하지 않기 때문에 이름이 필요하지 않다.
internal class Program
{
static void Main(string[] args)
{
var lee = new Human("이순재", 65);
Console.WriteLine(lee.name);
Console.WriteLine(lee.age);
var tempArr = new
{
arrInt = new int[] { 1, 2, 3 },
arrFloat = new float[] { 0.1f, 0.2f, 0.3f }
};
foreach (var item in tempArr.arrInt)
{
Console.WriteLine(item);
}
Console.WriteLine();
foreach (var item in tempArr.arrFloat)
{
Console.WriteLine(item);
}
}
}
}
<<결과값>>
이순재
65
1
2
3
0.1
0.2
0.3
위 코드에서 tempArr 이라는 변수를 new 생성자를 이용해 객체를 생성했는데, 자세히보면 객체의 이름이 없다. 이러한 객체를 익명 객체라고 한다.
internal class Program
{
delegate int CalDel(int x, int y);
static void Main(string[] args)
{
CalDel del;
del = delegate (int x, int y)
{
return x + y;
};
Console.WriteLine(del(20, 10));
}
}
이처럼 타입만 명시하고 어떤 함수인지 이름을 주지 않은 형태를 익명 메소드라고 한다. 이러한 형태의 함수는 이벤트 기반으로 작동할 때에만 사용을 한다.
코드의 복잡도를 줄여주기 위해 간소화시킨 식으로, 대표적인 예로 화살표함수가 있다.
람다식을 사용하는 궁극적인 목적은 "간결함"이다. 코드가 길어질수록 가독성이 떨어지고, 오류 등이 발생했을 때 찾기가 어려워지는 등 여러 문제가 발생할 수 있는데, 이러한 문제를 해결하기 위해 최대한 코드를 간결하고, 짧게 그러면서 이해하기 쉽도록 작성할 필요가 있다. 이러한 이유로 만들어진 것이 람다식이며, 람다식의 경우에는 인수의 타입도 생략이 가능하다.
internal class Program
{
delegate int CalDel(int x);
static void Main(string[] args)
{
CalDel d = (x) => x + 10;
Console.WriteLine(d(3));
}
}
<<결과값>>
13
예시 코드처럼 (인수) => 실행될 함수 정의만으로 표현하는 함수를 람다식이라고 한다.
이 때, 주의해야하는 것은 위에서 정의한 타입의 전달인자 갯수와 타입은 동일해야한다.
즉, CalDel(int x)에서 전달인자의 타입은 int이며, 갯수는 1개이기 때문에, 람다식에서도 전달되는 인자는 int타입으로 1개만 전달되어야 한다.
그럼 전달 인자가 2개면 어떻게 표현하면 될까??
internal class Program
{
delegate int CalDel(int x);
delegate int Add(int x, int y);
static void Main(string[] args)
{
CalDel d = (x) => x + 10;
Console.WriteLine(d(3));
Add sum = (x, y) => x + y;
Console.WriteLine(sum(10, 20));
}
}
<<결과값>>
전달인자가 1개인 경우: 13
전달인자가 2개인 경우: 30
과 같이 표현하면 된다. 전달인자가 없는 경우에도 동일한 방법으로 표현을 하면 된다.
마지막으로 문자열의 표현은 아래 코드처럼 표현이 가능하다.
internal class Program
{
delegate void printDel();
static void Main(string[] args)
{
printDel p = () => { Console.WriteLine("Hello, Lamda!"); };
p();
}
}
<<결과값>>
Hello, Lamda!
위 코드에서는 문자열을 출력만 하고, 따로 return값이 없어 void로 타입을 주었지만, return값이 필요하다면 다른 타입 선언도 가능하다.
언어 독립적인 질의문이며 데이터를 다루는 새로운 방법
링크로 발음하며, 네이티브 데이터 질의 기능을 닷넷 언어에 추가한 것으로 SQL문과 비슷하게 질의식의 추가를 통해 언어를 확장할 수 있다. 쿼리는 원하는 데이터를 검색하는 지시사항으로, 데이터를 읽기만 하는 것이 아니라 필터링, 정렬, 그룹핑 등 처리까지 포함된다.
Linq는 데이터 소스에 따라 다섯가지 범주의 쿼리문을 제공한다.
1. LINQ to Object
2. LINQ to DataSet
3. LINQ to SQL
4. LINQ to XML
5. LINQ to Entities