■ 람다 ( 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 * 2
는 x
를 받아 x
에 2
를 곱하는 람다 표현식입니다.
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();
}