-
I. 델리게이트
: 메서드를 변수처럼 전달하고 호출할 수 있게 하여, 메서드를 참조할 수 있는 형식.
: 대리자와 호출할 메서드는 데이터 형식과 매개변수를 통일시켜야함.
: 실제로는 접근이 불편한 상황일 때, 메서드를 델리게이트로 연결함.
정적 메서드 (Static Method)
: 클래스의 인스턴스 없이 호출이 가능.
: 클래스의 인스턴스에서는 호출이 불가능, 반드시 클래스명과 함께 호출.
class Methods { public static Method2(string message) { Console.WriteLine("Method2: " + message); } } internal class Program { static void Main(string[] args) { Methods.Method2("Hi"); // Method2를 사용하기 위해 클래스도 같이 호출함. } }
하나의 델리게이트는 복수의 메서드를 참조할 수 있다.
using System; namespace DelegateExercise { delegate void MyDelegate(string message); internal class Program { static void Main(string[] args) { Methods methods = new Methods(); // 인스턴스 메서드를 호출할 시, 객체를 만든 후, 호출해야함. MyDelegate myDelegate = methods.Method1; // 델리게이트에 메서드 추가 // 정적 메서드는 바로 호출 가능. myDelegate += Methods.Method2; // 델리게이트에 메서드 추가 myDelegate("Hello!"); // 델리게이트 실행 Console.ReadKey(); } } class Methods { public void Method1(string message) // 인스턴스 메서드 선언 { Console.WriteLine("Method1: " + message); } public static void Method2(string message) // 정적 메서드 선언 { Console.WriteLine("Method2: " + message); } } }
>
II. 이벤트
: 클래스 혹은 개체에서 발생하는 특정 상황이 발생했을 때 알리기 위한 메커니즘
public delegate void EnemyAttackHandler(float damage); public class Enemy { public event EnemyAttackHandler OnAttack; public void Attack(float damage) { OnAttack?.Invoke(damage); } } 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); }
이벤트를 발생시키는 클래스를 게시자, 이벤트를 받거나 처리하는 클래스를 구독자.
: 클래스 내부에서 이벤트를 발생시키고, 외부에서 이를 구독하여 특정 동작을 수행할 수 있게 함.
public class Enemy { public event EnemyAttackHandler OnAttack; // 이벤트 선언 : 게시자 public void Attack(float damage) { // 이벤트가 발생된다면, 발행자 OnAttack에 연결된 메서드들을 실행. OnAttack?.Invoke(damage); } }
public class Player { public void HandleDamage(float damage) // 게시자의 이벤트에 연결시킬 메서드 { // 플레이어의 체력 감소 등의 처리 로직 Console.WriteLine("플레이어가 {0}의 데미지를 입었습니다.", damage); } }
static void Main() { Enemy enemy = new Enemy(); Player player = new Player(); // 게시자의 이벤트(OnAttack)에 외부(Player 클래스의 인스턴스)에서 구독. // 델리게이트의 메서드 등록과 동일. enemy.OnAttack += player.HandleDamage; enemy.Attack(10.0f); // 이벤트 발생. 이벤트에 등록시킨 메서드 수행. }
델리게이트에서 보안성 증가 + 캡슐화 를 한 느낌.
: 델리게이트는 클래스 외부에서 호출할 수 있는데 반해, 이벤트는 클래스 외부에서 호출할 수 없다.
: = 연산자로 할당할 수 없다. += 과 -= 으로 추가와 삭제를 할 수 있다.
'C#' 카테고리의 다른 글
값형과 참조형 (0) 2023.08.24 예외 처리 (1) 2023.08.24 인터페이스와 열거형 (0) 2023.08.24 텍스트 던전 콘솔로 구현하기 - 작업중 학습(2) (0) 2023.08.23 스네이크 게임 만들기 (수정예정) (0) 2023.08.21