C# 기초 정리 - 람다

woollim·2024년 12월 10일
0

C#

목록 보기
14/14

■ 람다 ( Lambda )

람다란?

  • 람다(lambda)는 익명 메서드를 만드는 방법
  • 람다를 사용하면 메서드의 이름 없이 메서드를 만들 수 있음
  • 참조만을 가지고 컨트롤 함
  • 주로 간결한 형태로 델리게이트, 이벤트 또는 LINQ와 함께 사용됨
  • 람다는 델리게이트를 사용하여 변수에 할당하거나, 메서드의 매개변수로 전달할 수 있음
  • 간편히 사용할 수 있는 기능을 주로 구현

람다 장점

  • 간결성 : 람다 표현식을 사용하면 간단한 코드를 더 간결하게 작성할 수 있음
  • 유연성 : 메서드를 따로 선언하지 않고도 델리게이트와 같은 기능을 수행할 수 있어 코드를 더 쉽게 유지보수할 수 있음
  • LINQ와의 통합 : 람다 표현식은 LINQ에서 필터링, 매핑, 정렬 등 다양한 작업을 수행할 때 매우 유용함
  • 람다 표현식은 C#의 함수형 프로그래밍 스타일을 지원하며, 델리게이트와 함께 더 효율적이고 간결한 코드를 작성할 수 있도록 도움

람다 구현

  • (매개변수) => 표현식
  • => 연산자는 람다 연산자라고 하며, 왼쪽은 입력 파라미터, 오른쪽은 본문(실행될 코드)
  • 매개변수의 자료형은 생략 가능하며, 컴파일러가 문맥에 따라 추론함
  • 본문은 간단한 표현식일 수도 있고, 여러 줄로 이루어진 구문 블록일 수도 있음
  • 여러줄의 본문 내용이 필요하다면 표현식에 중괄호를 씌우면 됨
  • 매개변수 있는 예시
Calculate calc = (x, y) => 
{	
		return x + y;
};    // 중괄호 이용

Calculate calc = (x, y) => x + y;    // 단문 이용
  • 매개변수 없는 예시
() => Console.WriteLine("Hello, World!")
  • 매개변수가 하나일 때 매개변수가 하나만 있을 경우 괄호를 생략할 수 있음
x => x * 2
  • 블록 본문을 가진 람다 표현식이 한 줄이 아닐 경우 중괄호 {}로 블록을 사용해 여러 줄로 작성할 수 있음
(x, y) => {
    int result = x + y;
    return result;
}

○ 람다 예시

  • 델리게이트와 람다, 람다 표현식은 델리게이트와 함께 많이 사용됨.
    예를 들어, 델리게이트에 람다 표현식을 할당할 수 있음.
    여기서 Func<int, int>는 입력으로 int를 받고 출력으로 int를 반환하는 델리게이트.
    x => x * 2x를 받아 x2를 곱하는 람다 표현식입니다.
Func<int, int> square = x => x * 2;
Console.WriteLine(square(5)); // 출력: 10
  • 이벤트 핸들러에서의 람다 이벤트 핸들러에서도 익명 메서드를 대신해 람다 표현식을 사용할 수 있음
button.Click += (sender, args) => {
    Console.WriteLine("Button clicked!");
};
  • LINQ와 람다, 람다 표현식은 LINQ 쿼리에서 자주 사용됨.
    LINQ 메서드 구문은 람다 표현식을 사용하여 데이터를 필터링, 정렬 및 변환할 수 있음
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(x => x % 2 == 0).ToList();
// 짝수 필터링: { 2, 4 }
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// 람다 표현식을 사용해 짝수만 필터링
var evenNumbers = numbers.Where(x => x % 2 == 0);

foreach (var number in evenNumbers)
{
    Console.WriteLine(number); // 출력: 2, 4
}

○ 람다 심화 사용예제

using System;

// 델리게이트 선언
delegate void MyDelegate(string message);

class Program
{
    static void Main()
    {
        // 델리게이트 인스턴스 생성 및 람다식 할당
        MyDelegate myDelegate = (message) =>
        {
            Console.WriteLine("람다식을 통해 전달된 메시지: " + message);
        };

        // 델리게이트 호출
        myDelegate("안녕하세요!");

        Console.ReadKey();
    }
}
  • 게임의 분기 시작을 알리기
// 델리게이트 선언
public delegate void GameEvent();

// 이벤트 매니저 클래스
public class EventManager
{
    // 게임 시작 이벤트
    public event GameEvent OnGameStart;

    // 게임 종료 이벤트
    public event GameEvent OnGameEnd;

    // 게임 실행
    public void RunGame()
    {
        // 게임 시작 이벤트 호출
        OnGameStart?.Invoke();

        // 게임 실행 로직

        // 게임 종료 이벤트 호출
        OnGameEnd?.Invoke();
    }
}

// 게임 메시지 클래스
public class GameMessage
{
    public void ShowMessage(string message)
    {
        Console.WriteLine(message);
    }
}

// 게임 실행
static void Main()
{
    // 이벤트 매니저 객체 생성
    EventManager eventManager = new EventManager();

    // 게임 메시지 객체 생성
    GameMessage gameMessage = new GameMessage();

    // 게임 시작 이벤트에 람다 식으로 메시지 출력 동작 등록
    eventManager.OnGameStart += () => gameMessage.ShowMessage("게임이 시작됩니다.");

    // 게임 종료 이벤트에 람다 식으로 메시지 출력 동작 등록
    eventManager.OnGameEnd += () => gameMessage.ShowMessage("게임이 종료됩니다.");

    // 게임 실행
    eventManager.RunGame();
}

0개의 댓글