C# 콜백 패턴

김현승·2024년 4월 27일
0

C#

목록 보기
8/13

콜백 패턴은 프로그래밍에서 자주 사용되는 디자인 패턴 중 하나로, 한 함수가 다른 함수에게 작업의 완료나 발생한 이벤트를 알리기 위해 사용됩니다. 이 패턴은 비동기 처리, 이벤트 리스닝, 또는 특정 조건 발생 시 특정 로직을 수행하도록 할 때 유용합니다. 콜백은 일반적으로 함수의 인자로 다른 함수를 전달하는 방식으로 구현됩니다.

콜백 패턴의 주요 사용 사례

  1. 비동기 프로그래밍: 네트워크 요청, 파일 I/O 작업 등 비동기적으로 실행되어야 하는 작업의 완료 후 특정 작업을 수행하도록 할 때 콜백이 사용됩니다.
  2. 이벤트 리스너: 사용자 인터페이스에서 버튼 클릭, 키보드 입력 등의 이벤트가 발생했을 때 특정 함수를 호출합니다.
  3. 반복 작업 수행: 리스트나 배열을 순회하면서 각 요소에 대해 특정 작업을 수행하는 고차 함수(higher-order function)에서 콜백을 사용합니다. 예를 들어, 배열의 각 요소에 함수를 적용하는 map, filter 등의 함수입니다.

콜백 패턴의 구현 예제 (C#)

예제 1: 비동기 작업에서 콜백 사용

using System;
using System.Threading.Tasks;

public class CallbackExample
{
    public void ProcessDataAsync(string data, Action<string> callback)
    {
        Task.Run(() =>
        {
            // 데이터 처리 로직을 시뮬레이션
            System.Threading.Thread.Sleep(1000); // 1초 대기를 통해 비동기 작업을 가정
            string processedData = data.ToUpper(); // 데이터를 대문자로 변환

            // 콜백 함수 호출
            callback(processedData);
        });
    }
}

class Program
{
    static void Main()
    {
        var example = new CallbackExample();
        example.ProcessDataAsync("hello", result => Console.WriteLine("Processed data: " + result));

        Console.WriteLine("Waiting for data processing...");
        Console.ReadLine(); // 사용자 입력 대기 (비동기 작업 완료 대기)
    }
}

이 예제에서는 비동기적으로 데이터를 처리하고 결과를 콜백 함수를 통해 반환합니다.

예제 2: 이벤트 리스너에서 콜백 사용

using System;

public class EventPublisher
{
    // 콜백을 위한 델리게이트 선언
    public event Action OnClick;

    public void ClickButton()
    {
        Console.WriteLine("Button clicked!");
        OnClick?.Invoke(); // 콜백 이벤트 호출
    }
}

class Program
{
    static void HandleClick()
    {
        Console.WriteLine("Button click handled.");
    }

    static void Main()
    {
        var button = new EventPublisher();
        button.OnClick += HandleClick; // 콜백 등록

        button.ClickButton(); // 사용자가 버튼 클릭 시뮬레이션
    }
}

이 예제에서는 사용자가 "버튼"을 클릭하면 등록된 콜백 함수 HandleClick이 호출됩니다.

콜백 패턴의 장단점

장점

  • 비동기 작업을 간단하게 처리할 수 있습니다.
  • 이벤트 발생 시 즉시 반응하는 반응형 프로그래밍을 구현할 수 있습니다.
  • 모듈 간의 결합도를 낮출 수 있습니다.

단점

  • 콜백 지옥(Callback Hell): 콜백이 중첩되어 코드의 복잡도가 증가하고 가독성이 떨어질 수 있습니다.
  • 예외 처리가 어렵습니다: 비동기 콜백 패턴에서는 예외를 전파하고 처리하기 어려울 수 있습니다.

0개의 댓글