
메서드를 변수처럼 다룰 수 있도록 해주는 기능을 제공 : 함수 자체가 하나의 타입이 된다
delegate int MyDelegate(int p_a, int p_b);
class Program
{
static int Add(int p_a, int p_b)
{
return p_a + p_b;
}
static int Minus(int p_a, int p_b)
{
return p_a - p_b;
}
static int Multi(int p_a, int p_b)
{
return p_a * p_b;
}
static void Main(string[] args)
{
MyDelegate puls = Add;
// Add 함수를 변수처럼 사용할 수 있음
MyDelegate minus = Minus;
// 매개변수가 일치한다면 여러 함수를 대리할 수 있음
MyDelegate multi = Multi;
MyDelegate[] calculator = new MyDelegate[]
{
Add, Minus, Multi
};
for (int i = 0; i < calculator.Length; i++)
{
Console.WriteLine(calculator[i](20, 10));
// 덧셈, 뺄셈, 곱셈 순서로 결과 출력
}
MyDelegate 가 같은 형식(같은 매개변수와 반환형) 을 가진 함수를 대신 호출할 수 있음
이벤트(Event)는 특정 동작(또는 상태 변화)이 발생했을 때 이를 알리고 처리하기 위한 메커니즘이다.
class Program
{
// 대리자 선언
public delegate void Notify(string message);
// 이벤트 선언
public static event Notify OnProcessCompleted;
static void Main(string[] args)
{
// 이벤트 구독 (+= 형태로 이벤트에 메서드를 연결)
OnProcessCompleted += HandleProcessCompleted;
// 작업 수행
Process();
// 이벤트 구독 해제 (-= 형태로 이벤트에서 메서드를 제거)
OnProcessCompleted -= HandleProcessCompleted;
Console.ReadKey();
}
static void Process()
{
Console.WriteLine("Process started...");
// 이벤트가 null 이 아니면 이벤트 발생
OnProcessCompleted?.Invoke("Process completed successfully!");
}
// 이벤트에 추가된 메서드
static void HandleProcessCompleted(string message)
{
// 메서드가 실행되면서 전달된 이벤트가 출력
Console.WriteLine($"Event received: {message}");
}
}
출력
Process started...
Event received: Process completed successfully!
이벤트에 여러 메서드를 추가(구독)하고 이벤트 발생 시 해당 메서드들을 실행한다
한 줄로 메서드를 정의하고 사용할 수 있는 표현식
(매개변수) => { 표현식 또는 코드 블록 } 형태로 표현
int[] arr = new int[5] { 10, 4, 12, 1, 8 };
Func<int[], int[]> sort = (inputArr) =>
{
Array.Sort(inputArr);
return inputArr;
};
int[] sortedArr = sort(arr);
for (int i = 0; i < arr.Length; i++)
{
Console.Write($"{sortedArr[i]} \t");
}
출력
1 4 8 10 12
Func<int[], int[]> sort = (inputArr) 에서 int[] 는 입 출력의 제네릭이고 inputArr 는 매개변수
※ 람다 함수 사용 시 매개변수가 아닌 변수를 전달할 수 있다.
예시
int a = 10;
Func<int, int> square = (x) => x * x + a; // 매개변수가 아닌 a 를 return 에 추가
Console.WriteLine(square(5)); // 출력: 35
LINQ : C# 및 .NET에서 제공하는 강력한 데이터 쿼리 도구로 컬렉션, 데이터베이스, XML 등 다양한 데이터 소스를 SQL 같은 직관적인 방식으로 처리할 수 있도록 설계된 기능

int[] numbers = { 1, 2, 3, 4, 5, 6 };
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
foreach (var num in evenNumbers)
{
Console.WriteLine(num); // 출력: 2, 4, 6
}
var students = new[] // students : 3개의 익명 객체(new { Name, Score }) 로 구성된 배열
{
new { Name = "Alice", Score = 85 },
new { Name = "Bob", Score = 72 },
new { Name = "Charlie", Score = 90 }
};
// 점수가 80 이상인 학생만 추출
var highScorers = students
.Where(student => student.Score >= 80)
// Where : 배열의 각 요소를 student 라는 매개변수로 전달하는 메서드
// student = { Name = "Alice", Score = 85 } 여기서 Score >= 80 인지 확인
.OrderByDescending(student => student.Score)
// 점수를 기준으로 내림차순 정렬
.Select(student => new { student.Name, student.Score });
// 새 객체로 변환
foreach (var student in highScorers)
{
Console.WriteLine($"{student.Name}: {student.Score}");
}