낑깡의 게임 프로그래밍 도전기

C# 대리자(Delegate, Action) 본문

C#

C# 대리자(Delegate, Action)

낑깡겜플밍 2025. 7. 19. 17:36
반응형

프로그래밍을 설명할때 영화에 빗대어 설명하는 것이 좋다

a배우와 b배우가 잇다고 가정해보자 남자여자 배우가 포용하는 장면을 찍을걸 코드로 찍기

clasee ActorA
{
	public void Action()
    {
    	Console.WriteLine("A가 포옹한다")
    }
}

clasee ActorB
{
	public void Action()
    {
    	Console.WriteLine("B가 포옹한다")
    }
}

class Camera
{
	public void PickupCamera()
    {
    	Console.WriteLine("카메라를 든다")
    }
}

pulic void Action
{
      Consloe.WriteLine("B기 포옹한다")
      Camera camera = new Camera();
      camera.PickupCamera();
}
이렇게 코드를 짜면 의존성이 늘어난다.

static void Main(string [] args)
{
	Console.WriteLine("시작부분")
    
    new ActionA().Action();
    new ActionB().Action();
    Camera camera = new Camera();
    camera.PickupCamera();
}

이렇게 쓸수도 있겠지만...대리자를 쓸수 있다.

clasee ActorB
{
	public void Action(Action action)
    {
    	Console.WriteLine("B가 포옹한다")
        action.Invoke();
    }
}

static void Main(string [] args)
{
	Console.WriteLine("시작부분")
    
    new ActionA().Action();
    //실행할 함수를 담아줌 받는쪽에서는 내가 끝났어라고만 알려주면 실행됨
    new ActorB().Action(CameraPickup); //파라미터를 Action으로 받음
}

static void CameraPickup()
{
	Camera camera = new Camera();
    camera.PickupCamera();
}

 

clasee ActorA
{
	public void Action()
    {
    	Console.WriteLine("A가 포옹한다")
    }
}

clasee ActorB
{
	public void Action(Action<string> action)//string 받아 써줄수 있음 //받는 쪽에서는 모양만 유지해주면 됨 
    {
    	Console.WriteLine("B가 포옹한다")
        action.Invoke("나 액션 끝났어");//써줄 수 있음.
    }
}

static void Main(string [] args)
{
	Console.WriteLine("시작부분")
    
        new ActionA().Action();
    //실행할 함수를 담아줌 받는쪽에서는 내가 끝났어라고만 알려주면 실행됨
        new ActorB().Action(CameraPickup); //파라미터를 Action으로 받음
}

static void CameraPickup(string actorMessage)
{
	Console.WriteLine("카메라 감독이 받은 메세지 :" + actorMessage)

	Camera camera = new Camera();
	camera.PickupCamera();
}
//실행결과
시작부분
A가 포옹한다
B가 포옹한다
카메라 감독이 받은 메세지 : 나 액션 끝났어
카메라를 든다
dalegate vodi MyDelegate(string actoorMessage);//이렇게 델리게이트를 만들어서 Action대신에 쓸 수있다

internal Class Program
{
	clasee ActorA
	{
		public void Action()
   	 {
	   	 	Console.WriteLine("A가 포옹한다")	
	    }
	}

	clasee ActorB
	{
		public void Action(MyDelegate handler)//여기에 바꿔주기
	    {
	    	Console.WriteLine("B가 포옹한다")
	        action.Invoke("나 액션 끝났어");
	    }
	}

	static void Main(string [] args)
	{
		Console.WriteLine("시작부분")
        
		new ActionA().Action();
        
        MyDelegate myDelegate = CameraPicup;//이렇게
        myDelegate += Effect;//두개가 실행됨//myDelegate = Effect;이렇게 하면 바뀐다
		new ActorB().Action(myDelegate); //바꿔줌
	}

	static void CameraPickup(string actorMessage)
	{
		Console.WriteLine("카메라 감독이 받은 메세지 :" + actorMessage)
	
		Camera camera = new Camera();
		camera.PickupCamera();
	}
    
	static void Effect(string actorMessage)
	{
		Console.WriteLine("연출 감독이 받은 메세지 :" + actorMessage)
	
		Console.WriteLine("폭죽을 터트린다");
	}
}
//실행결과
시작부분
A가 포옹한다
B가 포옹한다
카메라 감독이 받은 메세지 : 나 액션 끝났어
카메라를 든다
연출 감독이 받은 메세지 : 나 액션 끝났어
폭죽을 터트린다

분리를 위해 델리게이트와 이벤트는 중요하다 안그러면 종속성 의존성이 높아진다.

 

용어정리

Delegate, event 기능이 있다.

이벤트, 콜백, 핸들러라는 말을 많이 쓴다  //위의 event와는 다른 이벤트다

보통 핸들러 델리게이트 이벤트 같은 경우는 쓰는 모양이 거의 흡사해서 많이 써봐야한다.

*a라는 스킬을 발동할때 파이어볼 10개를 줄일때. 스킬이 발동 이벤트만 넘겨주고 스킬을 관리 하는 곳에서 파이어불 리스트를 삭제 하는 것과 같이 기능 구분

 

반응형