public delegate 반환형 델리게이트이름(매개변수);
public delegate void MyDelegate(string message);
class Program
{
static void Main()
{
MyDelegate del = PrintMessage;
del += PrintAnotherMessage; // 메서드 체인 추가
del("Hello, World!"); // 두 개의 메서드가 호출됨
}
static void PrintMessage(string message)
{
Console.WriteLine(message);
}
static void PrintAnotherMessage(string message)
{
Console.WriteLine("Another: " + message);
}
}
delegate int Calculate(int x, int y);
static int Add(int x, int y)
{
return x + y;
}
class Program
{
static void Main()
{
// 메서드 등록
Calculate calc = Add;
// 델리게이트 사용
int result = calc(3, 5);
Console.WriteLine("결과: " + result);
}
}
delegate void MyDelegate(string message);
static void Method1(string message)
{
Console.WriteLine("Method1: " + message);
}
static void Method2(string message)
{
Console.WriteLine("Method2: " + message);
}
class Program
{
static void Main()
{
// 델리게이트 인스턴스 생성 및 메서드 등록
MyDelegate myDelegate = Method1;
myDelegate += Method2;
// 델리게이트 호출
myDelegate("Hello!");
Console.ReadKey();
}
}
public delegate void MyDelegate(string message);
class Publisher
{
public event MyDelegate MyEvent;
public void RaiseEvent(string message)
{
if (MyEvent != null)
MyEvent(message); // 이벤트를 발생시킴
}
}
class Subscriber
{
public void OnMyEvent(string message)
{
Console.WriteLine("Event received: " + message);
}
}
class Program
{
static void Main()
{
Publisher pub = new Publisher();
Subscriber sub = new Subscriber();
pub.MyEvent += sub.OnMyEvent; // 구독
pub.RaiseEvent("Hello, Event!"); // 이벤트 발생
}
}
// 델리게이트 선언
public delegate void EnemyAttackHandler(float damage);
// 적 클래스
public class Enemy
{
// 공격 이벤트
public event EnemyAttackHandler OnAttack;
// 적의 공격 메서드
public void Attack(float damage)
{
// 이벤트 호출
// Invoke() 함수 실행 콜
// ? 는 null 조건부 연산자, 자세한 설명은 바로 밑에
OnAttack?.Invoke(damage);
// null 조건부 연산자, null이면 실행안함. null아니면 실행
// null 참조가 아닌 경우에만 멤버에 접근하거나 메서드를 호출
}
}
// 플레이어 클래스
public class Player
{
// 플레이어가 받은 데미지 처리 메서드
public void HandleDamage(float damage)
{
// 플레이어의 체력 감소 등의 처리 로직
Console.WriteLine("플레이어가 {0}의 데미지를 입었습니다.", damage);
}
}
// 게임 실행
static void Main()
{
// 적 객체 생성
Enemy enemy = new Enemy();
// 플레이어 객체 생성
Player player = new Player();
// 플레이어의 데미지 처리 메서드를 적의 공격 이벤트에 추가
enemy.OnAttack += player.HandleDamage;
// 적의 공격
enemy.Attack(10.0f);
}
(매개변수) => 표현식
=>
연산자는 람다 연산자라고 하며, 왼쪽은 입력 파라미터, 오른쪽은 본문(실행될 코드)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;
}
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!");
};
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();
}
Func
과 Action
은 델리게이트를 대체하는 미리 정의된 제네릭 형식Func
및 Action
은 제네릭 형식으로 미리 정의되어 있어 매개변수와 반환 타입을 간결하게 표현할 수 있음Func<int, string>
는 int
를 입력으로 받아 string
을 반환하는 메서드를 나타냄Func<int, int, int> add = (x, y) => x + y;
Console.WriteLine(add(3, 4)); // 출력: 7
Func<DateTime> getCurrentTime = () => DateTime.Now;
Console.WriteLine(getCurrentTime()); // 현재 시간 출력
Func<int, int, bool> isGreater = (x, y) => x > y;
Console.WriteLine(isGreater(10, 5)); // 출력: True
Action
은 값을 반환하지 않는 메서드를 나타내는 델리게이트Action<int, string>
은 int
와 string
을 입력으로 받고, 아무런 값을 반환하지 않는 메서드를 나타냄 // 이벤트 핸들러로서의 예시
Action onButtonClick = () => Console.WriteLine("Button clicked!");
onButtonClick();
Action<int, int> printSum = (x, y) => Console.WriteLine(x + y);
printSum(3, 4); // 출력: 7
Action<string> printMessage = message => Console.WriteLine(message);
printMessage("Hello, World!"); // 출력: Hello, World!
Action sayHello = () => Console.WriteLine("Hello!");
sayHello(); // 출력: Hello!
// Func를 사용하여 두 개의 정수를 더하는 메서드
int Add(int x, int y)
{
return x + y;
}
// Func를 이용한 메서드 호출
Func<int, int, int> addFunc = Add;
int result = addFunc(3, 5);
Console.WriteLine("결과: " + result);
// Action을 사용하여 문자열을 출력하는 메서드
void PrintMessage(string message)
{
Console.WriteLine(message);
}
// Action을 이용한 메서드 호출
Action<string> printAction = PrintMessage;
printAction("Hello, World!");
class GameCharacter
{
private Action<float> healthChangedCallback;
private float health;
public float Health
{
get { return health; }
set
{
health = value;
healthChangedCallback?.Invoke(health); // HP가 변할때마다 알아서 호출이 됨
}
}
public void SetHealthChangedCallback(Action<float> callback)
{
healthChangedCallback = callback;
}
}
// 게임 캐릭터 생성 및 상태 변경 감지
GameCharacter character = new GameCharacter();
character.SetHealthChangedCallback(health =>
{
if (health <= 0)
{
Console.WriteLine("캐릭터 사망!");
}
});
// 캐릭터의 체력 변경
character.Health = 0;
class Program
{
static void Main()
{
// Func: 두 수를 더하고 결과를 반환
Func<int, int, int> add = (a, b) => a + b;
int result = add(10, 20);
Console.WriteLine(result); // 출력: 30
// Action: 두 수를 더한 결과를 출력 (반환값 없음)
Action<int, int> printSum = (a, b) => Console.WriteLine(a + b);
printSum(10, 20); // 출력: 30
}
}
var result = from 변수 in 데이터소스 // foreacn 문과 비슷하게 데이터 하나씩 꺼내옴
[where 조건식]
[orderby 정렬식 [, 정렬식...]]
[select 식];
var
키워드는 결과 값의 자료형을 자동으로 추론from
절에서는 데이터 소스를 지정where
절은 선택적으로 사용하며, 조건식을 지정하여 데이터를 필터링함orderby
절은 선택적으로 사용하며, 정렬 방식을 지정select
절은 선택적으로 사용하며, 조회할 데이터를 지정// 데이터 소스 정의 (컬렉션)
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// 쿼리 작성 (선언적인 구문)
var evenNumbers = from num in numbers
where num % 2 == 0
select num;
// 쿼리 실행 및 결과 처리
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}