Delegate란?
특정 형태의 메서드를 매개변수로 전달하는 의미
deldgate를 매개변수로 받아들이는 Count 메서드
1. Judgement의 이름만 정의함
2. Judge 매서드를 선언하고 선언한 곳
using System;
namespace _20211122
{
class Step3
{
public delegate bool Judgement(int value);
public int Count(int[] numbers, Judgement judge)
{
int count = 0;
foreach(var n in numbers)
{
if(judge() == true)
count++;
}
return count;
}
public void Do()
{
var numbers = new[] { 5, 3, 9, 6, 7, 5, 8, 1, 0, 5, 10, 4 };
Judgement judge = IsEven;
var count = Count(numbers, judge);
Console.WriteLine("result: " + count);
}
public bool IsEven(int n)
{
return n % 2 == 0;
}
}
class Program
{
static void Main(string[] args)
{
Step3 myStep = new Step3();
myStep.Do();
Console.WriteLine("Hello World!");
}
}
}
과제
delegate와 lamba 조사
- delegate
delegate는 매개변수로 함수를 전달하는 키워드이다. 각각의 함수의 기능을 최대한 나눠서 같은 함수내 delegate를 사용하여 다른 로직 처리가 가능하다는 것이다. 우리는 이를 통해 기능 단위별로 함수를 세분화하여 나눌 수 있고 중복되는 코드를 줄일수 있게 된다.
- Predicate는 델리게이트의 제너릭 버전, && 무명 delegate
predicate : judgement와 같은 델리게이트를 정의할 필요가 없다
무명 : 매서드의 이름을 빼고, 실제 내용만 넣겠다.
class Step4 {
public int Count(int[] numbers, Predicate<int> judge)
{
int count = 0;
foreach(var n in numbers)
{
if(judge(n) == true)
count++;
}
return count;
}
public void Do()
{
var numbers = new[] { 5, 3, 9, 6, 7, 5, 8, 1, 0, 5, 10, 4 };
var count = Count(numbers, delegate (int n) { return n % 2 == 0; } );
Console.WriteLine("result: " + count);
}
public bool IsEven(int n)
{
return n % 2 == 0;
}
}
- lamba
delegate 키워드 대신에 => (람다연산자) 사용,
형식!
매래변수 => 함수 내부
궁금증?
Q : judge의 대해서 return 타입을 정하지 않아도 되나요?
A : Yes, 컴파일이 알아서 판단
class Step5
{
public int Count(int[] numbers, Predicate<int> judge)
{
int count = 0;
foreach(var n in numbers)
{
if(judge(n) == true)
count++;
}
return count;
}
public void Do()
{
var numbers = new[] { 5, 3, 9, 6, 7, 5, 8, 1, 0, 5, 10, 4 };
Predicate<int> judge = (int n) =>
{
if(n % 2 == 0)
return true;
else
return false;
};
var count = Count(numbers, judge);
Console.WriteLine("result: " + count);
}
}
judge 변수를 사용하지 않고 더 간단하게 lamba를 이용해보자
class Step6
{
public int Count(int[] numbers, Predicate<int> judge)
{
int count = 0;
foreach(var n in numbers)
{
if(judge(n) == true)
count++;
}
return count;
}
public void Do()
{
var numbers = new[] { 5, 3, 9, 6, 7, 5, 8, 1, 0, 5, 10, 4 };
var count = Count(
numbers,
(int n) =>
{
if(n % 2 == 0)
return true;
else
return false;
}
);
Console.WriteLine("result: " + count);
}
}
'개발 기록 > C#' 카테고리의 다른 글
[C#] 윈도우 폼 - 체크 박스, 라디오 버튼, 그룹 박스 사용하기 (0) | 2021.12.10 |
---|---|
[C#] 윈도우 폼 - 콤보 박스, 리스트 박스 사용하기 (0) | 2021.12.09 |
[C#] Dictionary<T, T> 사용하기 (0) | 2021.12.09 |
[C# 기본기] out 키워드란? (0) | 2021.10.25 |
댓글