안녕하세요, 모스크바에서 생활하고 있는 개발자 윤진입니다.
C#에는 여러가지 흥미로운 기능이 많이 있습니다.
C는 포인터를 통해 함수를 변수처럼 이 함수, 저 함수로 전달할 수 있는데요,
C#에서도 delegate나 anonymous delegate, lambda 기능을 이용하여 메소드를 전달할 수 있습니다.
위의 방법들은 결국 메소드를 아규먼트로 전달하려는 목적으로 탄생했기에 큰 틀에서 보면 유사합니다.
1) 우선 전달하고자 하는 메소드의 원형을 선언합니다.
2) 그리고, 원형에 맞는 메소드(들)을 정의합니다.
3) 마지막으로 정의된 메소드를 아규먼트로 넣어 다른 메소드로 전달합니다.
- delegate
delegate를 선언하기 위해서는 일반 메소드처럼 선언하고 delegate 키워드만 앞에 추가하면 됩니다.
(곧, delegate <리턴타입> <이름>(<아규먼트>, ...)처럼 선언하면 됩니다)
아래 코드에서는 DelegateName이라고 delegate를 선언한 뒤,
DefinedMethod 메소드를 하나 정의한 후,
Main 함수 내에서 DefinedMethod를 대입하여 사용하고 있습니다.
delegate void DelegateName(int variable);
class Program
{
public static void DefinedMethod(int variable)
{
Console.WriteLine(variable);
}
static void Main(string[] args)
{
DelegateName method = DefinedMethod;
method(1);
}
}
- anonymous delegate
무명으로 delegate를 만들어서,
메소드의 이름을 짓는 번거로움에서 벗어날 수 있습니다.
delegate와 차이는 메소드 정의를 전달하는 위치에서 한다는 점입니다.
그렇기 때문에 method의 리턴타입과 이름을 생략하고 간단하게 정의할 수 있습니다.
delegate void DelegateName(int variable);
class Program
{
static void Main(string[] args)
{
DelegateName method = delegate(int variable)
{
Console.WriteLine(variable);
};
method(1);
}
}
- lambda
lambda는 위의 anonymous delegate보다 간소하게 사용할 수 있습니다.
delegate 키워드 대신 보다 직관적인 '=>'를 사용합니다.
그리고 아규먼트의 타입 지시자도 생략할 수 있습니다.
delegate void DelegateName(int variable);
class Program
{
static void Main(string[] args)
{
DelegateName method = (variable)=>
{
Console.WriteLine(variable);
};
method(1);
}
}
delegate나 lambda가 등장하여 closer variable와 같은 흥미진진한 변수도 등장하게 되는데요,
메모리 관리 측면은 차후에 다시 살펴보도록 하겠습니다.
끝_
'IT' 카테고리의 다른 글
Acer 노트북 + 우분투 16.04 이슈해결기 (2) | 2018.03.07 |
---|---|
[人터뷰] 개발자의 길에서 벗어나 영업으로 떠난 С군 (0) | 2017.02.28 |
[알고리즘] 유클리드 호제법, 간단하게 증명하기 (0) | 2017.02.22 |
[C#] Linq 기초용례 기록- (1) | 2017.02.20 |
[人터뷰] 모스크바에서 만난 개발자, 알렉세이 (0) | 2017.02.18 |
[C#] using과 Dispose()로 리소스 정리하기 (0) | 2017.02.13 |
[C#] 필드 사용가능? - interface, abstract class, partial class, virtual method (30) | 2017.02.12 |
[C#] 속성에 대한 간단한 테스트 (0) | 2017.02.09 |
[C#] 늘 헛갈리 Modal vs Modeless (0) | 2017.02.07 |
[C#] 소수점이 있는 숫자는 float일까 double일까. (30) | 2017.02.04 |