델리게이트
델리게이트(Delegate)는 대리자 라고도 하며 특정 매개 변수 목록 및 변환 형식이 있는 함수에 대한 참조이다.
- 대리자 인스턴스를 통해 함수를 호출할 수 있다.
- 델리게이트에 메소드의 주소를 할당 한 후 델리게이트를 호출하면 이 델리게이트가 메소드를 호출해준다.
- 델리게이트는 메소드에 대한 참조이기 때문에 자신이 참조할 반환형식과 매개변수를 명시해야 한다.
요약하자면
1.델리게이트 선언
2.선언한 델리게이트가 참조할 메서드 선언
3.델리게이트의 인스턴스를 만들고 델리게이트가 참조할 메서드를 매개변수로 넘김
4.호출
이 순서로 흘러간다고 생각하면 된다.
using System;
namespace _0311
{
internal class CalC
{
public delegate void TestDel(int a, int b);//delegate 선언
public static void SumNumber(int a, int b)
{
Console.WriteLine($"두 수의 합은 {a + b}");
}
public static void MinusNumber(int a, int b)
{
Console.WriteLine($"두 수의 차이는 {a - b}");
}
public static void MulNumber(int a, int b)
{
Console.WriteLine($"두 수의 곱은 {a * b}");
}
public static void NNumber(int a, int b)
{
Console.WriteLine($"두 수의 나누기 {a / b}");
}
static void Main()
{
TestDel testdel = SumNumber;
testdel += MinusNumber;
testdel += MulNumber;
testdel += NNumber;
testdel.Invoke(20, 10);
}
}
}
델리게이트 체인은 델리게이트 하나가 여러개의 메서드를 동시에 참조할 수 있도록 한다. +=기호를 통해 선언할 수 있다.
이벤트(Event)
이벤트는 일련의 사건이 발생했다 라는 사실을 다른 객체한테 전달한다.이를 통해 객체 간 느슨한 결합(Loose coupling)을 유지할 수 있따.일반적으로 이벤트는 이벤트를 발생시키는 객체를 선언하고,이를 처리할 수 있는 다른 객체(이벤트 헨들러)는 이벤트에 대한 구독을 등록한다.특수한 제약조건이 추가된 델리게이트 라고 생각하자.
- 이벤트는 +=와 -=를 사용해야한다.직접 호출은 불가능하다.
- += -> 이벤트에 반응할 객체의 추가할 함수이다 = 참조 추가
- -= -> 이벤트에 반응할 객체의 제거할 함수이다 = 참조 제거
이벤트는 'event'라는 키워드를 사용하여 선언된다. EventHandler라는 이름의 델리게이트를 선언해서 정의한다.
이벤트핸들러는 이벤트가 발생했을 때 호출될 메서드를 정의한다.
이벤트의 활용?
- UI 이벤트 처리
- 상태 변경 감지
namespace _03_11_homework
{
public class Player {
public event Action StartAttack;
public void Attack()
{
Console.WriteLine("공격을 시작한다!");
if (StartAttack != null) StartAttack();
}
}
public class SwordSkill
{
public void PowerSkill()
{
Console.WriteLine("파워 스트라이크!");
}
}
public class MagicSkill
{
public void IntSkill()
{
Console.WriteLine("매직 클로!");
}
}
public class ThiefSkill
{
public void LukSkill()
{
Console.WriteLine("럭키 세븐 !");
}
}
internal class Program
{
static void Main(string[] args)
{
Player player = new Player();
SwordSkill sword = new SwordSkill();
MagicSkill magic = new MagicSkill();
ThiefSkill thief = new ThiefSkill();
player.StartAttack += sword.PowerSkill;
player.StartAttack += magic.IntSkill;
player.StartAttack += thief.LukSkill;
player.Attack();
Console.WriteLine("플레이어가 공격을 종료합니다");
}
}
}
'C#은 처음이라' 카테고리의 다른 글
C# 자료구조 (큐Queue) (0) | 2024.03.12 |
---|---|
C# 자료구조(스택) (0) | 2024.03.12 |
C# 일반화(Generic) (1) | 2024.03.08 |
C# 문자열(string) (0) | 2024.03.07 |
C# 가상함수 (0) | 2024.03.06 |