Delegate..?

델리게이트란, 파라미터로 보내게 되는 테이터가 메서드인 경우로 메서드를 다른 메서드로 전달하는 형태를 가진다.

메서드의 형태를 그대로 유지하기 때문에 인자값이 델리게이트 타입으로 변경된다면 해당 타입, 갯수, 리턴타입만 동일하다면 메서드를 파라미터로 전달할 수 있다.

C#에서 사용할려면 delegate int DelegateTest(int num)처럼 생성하고 사용할 땐, 객체 생성과 비슷한 방식으로 new키워드를 통해 델리게이트 객체를 사용한다.

DelegateTest temp = new DelegateTest(DownInt)여기서 DownInt는 int DownInt(int num) {}으로 선언된 하나의 메서드로 해당 메서드를 파라미터에 넣어서 하나의 클래스를 생성한 것.

델리게이트또한 클래스이므로 해당 클래스의 객체를 생성

실제로 메서드를 사용하기 위해선 Invoke()메서드를 사용하여 호출한다.

하지만 대부분의 경우 .Invoke를 생략하고 전달된 델리게이트 명을 그대로 사용하여 호출한다.

unity를 사용하여 실습하였습니다.

public class MyDelegate : MonoBehaviour
{
    delegate int TestDelegate(int num);

    private void Start()
    {
        TestDelegate temp = new TestDelegate(AddOne);
        
        Test(temp);
    }
    
    int AddOne(int num)
    {
        return ++num;
    }

    void Test(TestDelegate myDelegate)
    {
        int n = myDelegate(4878);
        
        Debug.Log(n.ToString());
    }
}

정말 간단한 예제이다.

delegate의 활용(1)

위의 예제로 이해했다면 왜 사용하는지에 대한 의문이 들 수 있다.

하지만 메서드와 마찬가지로 반복되는 호출에 대한 부담이 덜어지며 메서드 자체를 파라미터로 받는다는 점에 대한 확장성이 넓어지게 된다.

public class MyDelegate : MonoBehaviour
{
    delegate int TestDelegate(int num);

    private void Start()
    {
        TestDelegate temp = new TestDelegate(AddOne);
        
        Test(temp);

        temp = new TestDelegate(DleOne);
        // temp = DleOne도 가능

        Test(temp);
    }
    
    int AddOne(int num)
    {
        return ++num;
    }

    int DleOne(int num)
    {
        return --num;
    }

    void Test(TestDelegate myDelegate)
    {
        int n = myDelegate(4878);
        
        Debug.Log(n.ToString());
    }
}
  1. 동일한 파라미터, 리턴타입, 개수를 가진 함수는 메서드로 전달이 가능하다.
  2. 필요에 의한 메서드만 생성 후 추가할 수 있다.

위 코드에서 수정된 부분은 새로운 메서드에 대한 정의부분만 존재하고 나머지함수에 대해서는 수정하지 않았다는 점..

delegate의 활용(2)

+= or -=를 통해 메서드를 추가로 할당하여 사용도 가능하다.

만약 버튼이 눌리게 되면 실행해야 하는 다양한 메서드들이 존재한다고 하면 할당연산자를 통해 델리게이트 객체에 필요한 메서드들을 붙여놓을 수 있다.

하지만 이러한 델리게이트도 문제점이 존재한다.

=연산자를 통해 지금까지 할당해온 메서드를 통째로 날려버리거나 delegate특성상 외부에서도 호출이 가능하기 때문에 객체지향개념에서 벗어나게 된다.

이러한 문제점을 개선하기 위해 event를 사용한다.

태그: ,

카테고리:

업데이트:

댓글남기기