Notice
Recent Posts
Recent Comments
Link
스토리지
[3.22] delegate 대리자 본문
delegate - 대리자
- 메서드에 대한 참조를 나타내는 형식.
- 인스턴스화하면 모든 메소드에 연결할 수 있다.
- 형식선언
접근자 delegate 반환형식 이름(매개변수);
- 액세스 가능한 클래스 또는 대리자 형식과 일치하는 구조(반환타입 및 매개변수가 동일)의 모든 메서드는 대리자에 할당이 가능.
- 대리자는 Call-Back 메서드 정의에 이상적임.
- 대리자를 통해 메서드를 매개변수로 전달할 수 있음.
- 클래스 안에 쓸 수 있고, 클래스 밖에도 쓸 수 있다.
- delegate에 연결된 함수 정의
// Create a method for a delegate.
public static void DelegateMethod(string message)
{
Console.WriteLine(message);
}
- delegate 인스턴스화
// Instantiate the delegate.
Del handler = DelegateMethod;
// Call the delegate.
handler("Hello World");
- delegate라는 객체안에 메소드를 참조시키는 것.
- 함수를 직접 호출하지 않고 대리자를 이용해서 호출함.
예제 0
using System;
namespace Study09
{
public class App
{
//1.델리게이트 선언
public delegate void Del(string message);
public App()
{
Console.WriteLine("App");
//3. 델리게이트 인스턴스화 (델리게이트에 메서드 연결)
Del handler = this.DelegateMethod;
//4. 델리게이트 호출
handler("Hello World!");
}
//2. 델리게이트 메서드 정의
public void DelegateMethod(string message)
{
Console.WriteLine(message);
}
}
}
예제 1 Callback
using System;
namespace Study09
{
public class App
{
//1.델리게이트 선언
public delegate void Del(string message);
public App()
{
Console.WriteLine("App");
//3. 델리게이트 인스턴스화 (델리게이트에 메서드 연결)
Del handler = this.DelegateMethod;
//5. 델리게이트 호출
MethodWithCallback(handler);
}
//2. 델리게이트 메서드 정의
public void DelegateMethod(string message)
{
Console.WriteLine(message);
}
//4. 콜백 메서드 정의
public void MethodWithCallback(Del callback)
{
callback("Hello World");
}
}
}
예제 2
using System;
namespace Study09
{
public class App
{
public App()
{
Console.WriteLine("App");
//마린 및 저글링 생성
Marine marine = new Marine();
marine.endAttack = EndAttack;
Zergling zergling = new Zergling();
//마린이 저글링 공격
marine.Attack(zergling);
}
public void EndAttack()
{
Console.WriteLine("이펙트 생성");
}
}
}
using System;
namespace Study09
{
public class Marine
{
//1. 델리게이트 선언
public delegate void DelEndAttack();
//멤버 변수 선언 (델리게이트)
public DelEndAttack endAttack;
public Marine()
{
}
//공격
public void Attack(Zergling target)
{
Console.WriteLine(target + "을 공격했습니다.");
//타겟에게 피해를 준다.
target.Hit(6);
this.endAttack();
}
}
}
using System;
namespace Study09
{
public class Zergling
{
private int hp;
private int maxHp;
public Zergling()
{
this.maxHp = 35;
this.hp = this.maxHp;
}
public void Hit(int damage)
{
Console.WriteLine("피해({0})를 입었습니다.", damage);
this.hp -= damage;
Console.WriteLine("{0}/{1}", this.hp, this.maxHp);
}
}
}
예제 3
using System;
namespace Study09
{
public class App
{
public App()
{
//마린 생성
Marine marine = new Marine();
//3-2 .델리게이트 인스턴스화
marine.moveComplete = this.MoveComplete;
//마린 이동 -> 이동완료
marine.Move();
}
//2. 마린 델리게이트에 연결할 메서드 정의
public void MoveComplete()
{
Console.WriteLine("[App] 이동완료.");
}
}
}
using System;
namespace Study09
{
//1. 델리게이트 선언
public delegate void DelMoveComplete();
public class Marine
{
//3-1. 델리게이트 변수선언
public DelMoveComplete moveComplete;
public Marine()
{
}
public void Move()
{
Console.WriteLine("[Marine] 마린 이동합니다.");
//델리게이트 호출
this.moveComplete();
}
}
}
'Unity > 수업내용(C#)' 카테고리의 다른 글
[3.22] 매개변수가 있는 delegate (0) | 2021.03.22 |
---|---|
[3.22] delegate 연습 (0) | 2021.03.22 |
[3.19] Partial 클래스 (분할 클래스) (0) | 2021.03.19 |
[3.19] 2048 게임 (1차원) (0) | 2021.03.19 |
[3.18] 2차원 배열 연습 5 - 2차원 배열을 이용한 좌표 이동 (0) | 2021.03.18 |
Comments