이전 포스트에서는 델리게이트에 아직 문제가 남아있다고 말씀드렸습니다.
무엇이 문제인지 한번 확인해보겠습니다.
위와 같이 델리게이트를 호출해야 하는 함수가 아닌 외부에서 델리게이트를 호출할 수 있다는 문제가 존재합니다.
실제 실행해보면
위와 같이 실행되는 것을 확인할 수 있습니다.
지금의 코드에서는 단순히 로그를 찍는 코드이므로 큰 문제가 되지 않지만,
사용자의 정보를 갱신하는 것과 같은 중요한 데이터를 다루는 코드라면 델리게이트는 아무렇게나 호출되어선 안됩니다.
이는 코드의 흐름과 설계의 규칙에도 위배될 뿐만 아니라 프로그램의 데이터 역시 망가트릴 수 있습니다.
이러한 문제를 해결하기 위해 C#에서는 event 키워드를 제공합니다.
event 키워드를 사용하는 경우에는 오직 구독한 존재만이 델리게이트를 호출할 수 있게 됩니다.
1) 사용방법
event 지시자의 사용은 굉장히 간단합니다.
델리게이트가 다음과 같이 선언되었다면,
접근제어 delegate 리턴형 델리게이트이름()
event 지시자는 다음과 같이 사용합니다.
접근제어 event 델리게이트이름 델리게이트인스턴스이름
위와 같이 사용합니다.
그렇다면 예제를 통해 한번 알아보겠습니다.
2) 사용예제
위의 클래스는 델리게이트와 관련된 EventManager입니다.
델리게이트와 델리게이트로 사용할 event 인스턴스가 있고 이 인스턴스를 실행하는 ShowEvent 함수가 존재합니다.
main 함수는 위와 같습니다.
Event1과 Event2라는 함수를 델리게이트에 구독시켜 발행합니다.
이제 델리게이트는 오직 구독해야만 호출이 가능합니다.
실행결과는 다음과 같습니다.
위와 같이 구독한 존재들만이 델리게이트를 호출하고 사용할 수 있게 개선시켜보았습니다.
위와 같이 event 지시자를 사용하여 특정대상에게만 동작을 허용하는 패턴을
Observer 패턴이라고 합니다. 이는 객체지향의 원리 중 은닉성과도 연관이 있습니다.
'C#' 카테고리의 다른 글
C#에서 쓰레드를 생성하는 방법 (0) | 2024.11.25 |
---|---|
람다식 (0) | 2024.09.28 |
델리게이트 (0) | 2024.09.14 |
attribute와 reflection (0) | 2024.09.07 |
C#의 예외처리 (0) | 2024.09.07 |