본문 바로가기
우아한 코딩

[C#] 이벤트 개념과 이벤트를 이용한 코딩 사례 3가지

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

C#에서 객체 간의 통신과 상호작용을 가능하게 하는 유용한 기능으로 이벤트가 있습니다.

이번 글에서는 이벤트의 개념과 이벤트를 이용하여 유용한 코딩 사례를 살펴보겠습니다.

 

            <글 순서>

  1. 이벤트(Event)의 개념
  2. 이벤트의 선언과 구독
  3. 이벤트를 이용한 유용한 코딩 사례: 옵저버 패턴
  4. 이벤트를 이용한 유용한 코딩 사례: 이벤트 기반 프로그래밍
  5. 이벤트를 이용한 유용한 코딩 사례: 비동기 프로그래밍

 

이벤트 개념과 코딩 사례

1. 이벤트(Event)의 개념

이벤트란 프로그램 내에서 발생하는 신호를 나타내며, 주로 객체 간 상호작용 및 통신에서 중요한 역할을 합니다.

사용자의 동작이나 시스템 상태의 변화와 같은 외부 요소로 인해 발생하며, 해당 이벤트에 연결된 핸들러가 실행됩니다.

또한, 이벤트는 객체 지향 프로그래밍에서 코드의 모듈화와 유연성을 증가시키는 데 기여합니다.

 

2. 이벤트의 선언과 구독

이벤트는 일반적으로 클래스 내에서 delegate 형식의 이벤트 필드로 선언됩니다.

이벤트를 선언함으로써 해당 이벤트가 발생할 때 실행될 메서드를 정의하게 되며, 이를 이벤트 핸들러라고 합니다.

이벤트 핸들러는 시스템에서 이벤트 발생 시 호출될 함수를 참조하며, 이벤트를 구독하여 해당 함수가 이벤트 발생 시마다 실행되도록 설정합니다.

 

3. 이벤트를 이용한 유용한 코딩 사례 (1) : 옵저버 패턴

옵저버 패턴은 객체 간의 일대다 종속성을 정의하는 디자인 패턴입니다.

또한, 한 객체의 상태 변화가 다수의 종속 객체에게 알려지고 자동으로 업데이트되도록 하는 메커니즘을 제공하는데, 이를 이벤트를 통해 구현할 수 있으며, 주제(subject) 객체에서 발생한 이벤트를 관찰자(observer) 객체에게 알리는 방식으로 동작합니다.

이렇게 함으로써 객체들 간의 결합도를 낮추고 확장성을 향상시킬 수 있습니다.

옵저버 패턴을 이벤트를 통해 구현하는 것을 예시 코드와 함께 설명해보겠습니다.

using System;

// 옵저버 인터페이스
interface IObserver
{
    void Update(int data);
}

// 주제 클래스
class Subject
{
    // 이벤트 선언
    public event EventHandler<int> DataChanged;

    // 데이터 변경
    public void ChangeData(int newData)
    {
        // 이벤트 발생
        DataChanged?.Invoke(this, newData);
    }
}

// 옵저버
class Observer : IObserver
{
    // 업데이트 구현
    public void Update(int data)
    {
        Console.WriteLine($"데이터가 변경되었습니다. 새로운 데이터: {data}");
    }
}
// profram
class Program
{
    static void Main(string[] args)
    {
        Subject subject = new Subject(); //subject
        Observer observer = new Observer(); //observer

        // 이벤트 구독
        subject.DataChanged += observer.Update;

        // 주제에서 데이터 변경
        subject.ChangeData(10);
    }
}

 

위의 코드에서는 옵저버 패턴을 구현하기 위해 이벤트를 사용하였습니다.

Subject 클래스는 데이터의 변경을 감지하고 관찰자에게 알리는 역할을 하며 이를 위해 DataChanged라는 이벤트를 선언하고, 데이터가 변경될 때마다 이벤트를 발생시킵니다.

Observer 클래스는 IObserver 인터페이스를 구현하여 업데이트 메서드를 정의합니다.

이 메서드는 주제에서 발생한 이벤트에 응답하여 새로운 데이터를 출력합니다.

Main 메서드에서는 Subject와 Observer 객체를 생성한 후, 이벤트를 구독합니다.

그리고 Subject에서 데이터를 변경하면, 이벤트가 발생하여 Observer 객체가 새로운 데이터를 출력하게 됩니다.

이렇게 함으로써  Subject와 Observer  간의 느슨한 결합을 유지하면서 객체 간의 상호작용 구현이 가능합니다.

 

4. 이벤트를 이용한 유용한 코딩 사례 (2) : 이벤트 기반 프로그래밍

주로 GUI 응용 프로그램에서 많이 사용되는 이벤트 기반 프로그래밍은 사용자의 동작에 따라 발생하는 이벤트를 기반으로 프로그램이 동작하도록 설계됩니다.

예를 들어, 사용자가 특정버튼을 클릭하거나 마우스를 이동시킬 때마다 해당 이벤트를 감지하여 필요한 동작을 수행하도록 하는 것이 이벤트 기반 프로그래밍의 핵심입니다.

이벤트를 이용하여 GUI 응용 프로그램을 개발하면 사용자와의 상호작용이 원활하고 직관적으로 이루어지며, 사용자 경험을 향상시킬 수 있습니다.

이벤트 기반 프로그래밍을 이해하기 위해 간단한 GUI 응용 프로그램을 예시로 살펴보겠습니다.

using System.Windows.Forms;

// 클래스
class Program
{
    static void Main(string[] args)
    {
        // 폼 생성
        Form form = new Form();
        form.Text = "이벤트 기반 프로그래밍 예제";

        // 버튼 생성
        Button button = new Button();
        button.Text = "클릭해주세요";
        button.Click += Button_Click; // 버튼 클릭 이벤트 핸들러 등록

        // 폼에 버튼 추가
        form.Controls.Add(button);

        // 폼 실행
        Application.Run(form);
    }

    // 버튼 클릭 이벤트 핸들러
    static void Button_Click(object sender, EventArgs e)
    {
        MessageBox.Show("버튼이 클릭되었습니다!");
    }
}

 

위의 코드에서는 버튼을 클릭했을 때 발생하는 Click 이벤트를 처리하는 예시입니다.

버튼 객체를 생성하고 Click 에 대한 이벤트 핸들러를 정의한 후, 버튼이 클릭되면 MessageBox를 통해 메시지가 표시됩니다.

이렇게 이벤트를 이용하여 GUI 응용 프로그램을 작성하면 사용자의 동작에 반응하는 프로그램을 쉽게 구현할 수 있습니다.

 

5. 이벤트를 이용한 유용한 코딩 사례 (3) : 비동기 프로그래밍

이벤트를 이용하여 비동기적인 작업을 처리하는 것도 유용한 코딩 사례입니다.

비동기 프로그래밍은 작업 종료까지 기다리지 않고 다른 작업을 수행할 수 있는 방식으로, 프로그램의 성능을 향상시키는 데 도움이 됩니다.

예를 들어, 파일을 다운로드하는 동안 프로그램 중단 없이 다른 작업을 계속해서 수행할 수 있도록 비동기적인 이벤트 처리를 구현할 수 있습니다.

이를 통해 프로그램이 느려지거나 멈추는 현상을 방지할 수 있으며, 사용자에게 더 나은 반응성을 제공할 수 있습니다.

 

비동기 프로그래밍에서 이벤트를 이용하는 예시로 파일 다운로드 작업을 들 수 있습니다.

using System.Threading.Tasks;
using System.Net;

// 클래스
class Program
{
    static async Task Main(string[] args)
    {
        WebClient client = new WebClient();

        // 비동기적으로 파일 다운로드
        client.DownloadProgressChanged += Client_DownloadProgressChanged;
        await client.DownloadFileTaskAsync(new Uri("http://example.com/file.zip"), "file.zip");

        Console.WriteLine("다운로드 완료");
    }

    // 다운로드 진행 상황을 표시하는 이벤트 핸들러
    static void Client_DownloadProgress(object sender, DownloadProgressChangedEventArgs e)
    {
        Console.WriteLine($"다운로드 진행률: {e.ProgressPercentage}%");
    }
}

 

위의 코드에서는 WebClient를 사용하여 비동기적으로 파일을 다운로드하는 예제입니다.

DownloadProgressChanged 이벤트를 이용하여 다운로드 진행 상황을 표시하고, 다운로드가 완료되면 "다운로드 완료" 메시지가 출력됩니다.

이렇게 이벤트를 이용하여 비동기적인 작업을 처리하면 프로그램이 중단되지 않고도 다른 작업을 진행할 수 있습니다.

 

마치며

지금까지 이벤트란 무엇이고 또 이를 이용한 유용한 코딩 사례를 살펴보았습니다.

이벤트는 프로그램 내에서 발생하는 다양한 상황에 대응하여 유연하고 효율적으로 동작할 수 있도록 도와줍니다.

이를 통해 GUI 응용 프로그램의 개발이나 비동기 작업 처리 등 다양한 상황에서 프로그램의 성능을 향상시킬 수 있습니다 

또한 올바르게 이벤트를 활용하면 코드의 가독성을 높이고 유지보수성도 향상시킬 수 있으며, 확장성 있는 소프트웨어를 개발할 수 있습니다.

반응형