본문 바로가기
우아한 코딩

Delegate를 이용한 콜백 표현

by 피크인사이트 2024. 4. 12.
반응형

안녕하세요? 이번 글에서는 함수 포인터와 유사한 개념으로, 메서드를 참조할 수 있는 'Delegate'를 이용하여 콜백을 표현하는 방법에 대해 알아보겠습니다.

콜백(callback)을 구현하여 비동기적인 이벤트 처리나 다른 객체로부터의 알림을 받을 수도 있습니다.

 

<Delegate를 이용한 콜백 표현>

1. Delegate의 개념

C# 에서 Delegate는 함수 포인터와 유사한 개념으로 메서드를 참조할 수 있는 형식이라 할 수 있습니다.

또한 다른 언어의 함수포인터와도 비슷한 역할을 하며, 메서드 시그니처가 일치하는 모든 메서드를 참조할 수 있습니다.


2. 콜백(callback) 함수와의 관계

Delegate를 이용하면 다른 객체나 시스템으로부터의 알림을 받는 콜백 함수를 구현할 수 있습니다.

그리고 Delegate를 통해 콜백 함수를 지정하면 해당 이벤트가 발생했을 때 자동으로 콜백 함수가 호출되는데 이 방법은 비동기적인 이벤트 처리나 작업 완료 시 호출되는 콜백 함수 등 다양한 상황에서 활용됩니다.

 


3. Delegate의 선언과 사용

Delegate를 선언하고 사용하는 방법을 다음 예시코드로 확인해 보겟습니다.

 

//Delegate 선언방법 
 delegate void MyDelegate(int x, int y);

//program 
class Program
{
    static void Main(string[] args)
    {
        // Delegate 인스턴스 생성
        MyDelegate myDelegate = new MyDelegate(Add);

        // Delegate 호출
        myDelegate(3, 5); // 출력: 8
    }

    // Delegate가 참조하는 메서드
    static void Add(int x, int y)
    {
        Console.WriteLine(x + y);
    }
}

위 예제에서는 MyDelegate라는 Delegate를 선언하고 Add라는 메서드를 이를 통해 호출하는 방법을 보여줍니다.

Delegate는 메서드 시그니처와 일치하는 모든 메서드를 참조할 수 있으며, 인스턴스를 생성하여 메서드를 할당하여 사용할 수 있습니다.


4. 콜백을 통한 비동기 작업 처리

비동기적인 작업의 완료를 Delegate를 이용하여 콜백으로 처리하는 방법을 설명합니다.

예를 들어, 비동기적인 파일이 다운로드되었을 때 호출되는 콜백함수를 구현할 수 있습니다.

이를 위해 비동기 작업을 시작할 때 Delegate에 콜백 함수를 등록하고, 작업이 완료되었을 때 해당 콜백 함수가 호출됩니다.

class Downloader
{
    // 다운로드 완료 시 호출되는 콜백 Delegate
    public delegate void DownloadCompletedCallback(string fileName);

    // 비동기적으로 파일 다운로드하는 메서드
    public void DownloadFile(string url, DownloadCompletedCallback callback)
    {
         // 파일 다운로드 로직
         ......
         // 다운로드 완료 후 콜백 호출
        callback("file.txt");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Downloader downloader = new Downloader();
        
        // 콜백함수를 등록하여, 파일 다운로드 완료 시 호출되도록 함
        downloader.DownloadFile("http://example.com/file.txt", FileDownloadedCallback);
    }

    // 파일 다운로드 완료 시 호출되는 콜백 함수
    static void FileDownloadedCallback(string fileName)
    {
        Console.WriteLine("File downloaded: " + fileName);
    }
}

5. 다중 콜백 처리

이번에는 아래 예시코드를 통해 Delegate를 이용하여 다중 콜백을 처리하는 방법을 살펴보겠습니다

여러 개의 콜백 함수가 등록되어 있을 때, 모든 콜백 함수가 호출되는 방식으로

이런 방식을 통해 하나의 이벤트에 여러 개의 리스너를 등록하고, 모든 리스너에게 이벤트를 알리는 패턴을 구현할 수 있습니다

 class EventPublisher { 
 	public delegate void EventHandler(); 
    public event EventHandler MyEvent; 
    public void TriggerEvent() { 
    	MyEvent?.Invoke(); // 이벤트 발생 
    } 
    
} 
// class Program 
class Program { 
	static void Main(string[] args) { 
    	EventPublisher publisher = new EventPublisher();
        
        // 다중콜백 등록 
         publisher.MyEvent += Method1;
         publisher.MyEvent += Method2;
         
        // 이벤트 발생 
        publisher.TriggerEvent(); //
    } 

	static void Method1() { 
		Console.WriteLine("Method 1 called."); //
	} 

	static void Method2() { 
		Console.WriteLine("Method 2 called.");
	} 
}

.위의 예제에서는 EventPublisher 클래스가 MyEvent라는 이벤트를 정의하고 있으며, Method1과 Method2가 이 이벤트에 등록된 콜백 함수입니다.

TriggerEvent 메서드가 호출되면 등록된 모든 콜백 함수가 순서대로 호출됩니다.


6. 장단점

Delegate를 이용한 콜백의 장단점을 살펴보겠습니다.

장점

  • 유연성: Delegate를 이용하여 콜백을 구현하면 코드의 유연성이 증가합니다. 다른 객체나 시스템으로부터의 알림을 받아 처리할 수 있으므로 비동기적인 작업 처리 등에 유용합니다.
  • 재사용성: 콜백 함수를 Delegate로 전달하면 해당 콜백 함수를 다양한 상황에서 재사용할 수 있습니다. 비슷한 작업을 수행하는 여러 메서드에서 동일한 콜백 함수를 사용할 수 있습니다.
  • 확장성: 여러 개의 콜백 함수를 등록하여 다양한 동작을 처리할 수 있습니다. 이를 통해 하나의 이벤트에 대해 다양한 동작을 수행할 수 있습니다.

단점

  • 메모리 누수: Delegate를 이용하여 콜백을 구현할 때 메모리 누수 발생이 가능합니다
    Delegate가 메모리를 계속 유지하고 있기 때문에 사용하지 않는 Delegate가 메모리에 쌓일 수 있습니다.
    이를 방지하기 위해 Delegate를 사용한 콜백 등록 후에는 해당 Delegate를 명시적으로 제거해야 합니다.
  • 복잡성: Delegate를 이용한 콜백은 코드의 가독성을 해칠 수 있습니다.
    여러 개의 콜백 함수가 등록되어 있을 때 코드의 흐름과 내용을 이해하기 어려울 수 있으며, 콜백 함수가 여러 곳에서 호출되는 경우 코드가 매우 복잡해질 수 있습니다.
  • 오버헤드: Delegate를 사용한 콜백은 일반적으로 호출에 대한 오버헤드가 있습니다.
    Delegate를 통해 메서드를 호출할 때 추가적인 작업이 필요하기때문에 성능 저하가 일부 발생할 수 있습니다.

마무리

Delegate를 이용한 콜백은 C#에서 다양한 상황에서 유용하게 활용됩니다.

Delegate를 통해 콜백을 구현하면 코드의 유연성과 재사용성을 높일 수 있으며, 비동기적인 작업 처리 등에 효과적으로 활용할 수 있습니다.

그러나 메모리 누수와 복잡성 같은 단점도 고려해야 하는 점을 주의하여야 합니다.

감사합니다.

반응형