대리자, 이벤트, 람다, LINQ

doyeon kim·2025년 1월 21일

C#

목록 보기
6/13
post-thumbnail

대리자(delegate)

메서드를 변수처럼 다룰 수 있도록 해주는 기능을 제공 : 함수 자체가 하나의 타입이 된다

예시

 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)

이벤트(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!

이벤트에 여러 메서드를 추가(구독)하고 이벤트 발생 시 해당 메서드들을 실행한다


람다 함수

한 줄로 메서드를 정의하고 사용할 수 있는 표현식
(매개변수) => { 표현식 또는 코드 블록 } 형태로 표현

예시 : 정렬함수(sort)

 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

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
}

예제(80점 이상 출력)

 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}");
            }

0개의 댓글