스토리지

[3.22] delegate 대리자 본문

Unity/수업내용(C#)

[3.22] delegate 대리자

ljw4104 2021. 3. 22. 10:42

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();
        }
    }
}

Comments