본문 바로가기
C#

이벤트

by imagineer_jinny 2021. 7. 21.

이벤트 사용 이유: 두 오브젝트 사이에 커플링이라고 부르는 직접도를 없애기 위해서

이벤트는 기본적으로 publisher와 subscriber로 나눠서 두개 사이의 커플링을 낮춰주고 동시에 델리게이트를 사용할 때 이벤트란 키워드를 사용하면 좀 더 엄격하게 델리게이트를 이벤트에 맞춰 사용할 수 있단 얘기!

 

커플링: 두 오브젝트가 잘 알고지내고 하드하게 연결되어있는 정도

커플링이 심하다: A, B 오브젝트가 서로 심하게 엮어있어서 A가 없어지면  B가 영향을 받기 떄문에 코드를 수정하기 쉽지 않다는 것.

코드를 깔끔하게? : 커플링을 줄이는데 집중

 

publisher : 어떤 이벤트를 쥐고 발동 시키는 측

subscriber : 어떤 이벤트에 자기 자신의 기능을 등록시켜놓고 대기하는 측

 

publisher은 이벤트를 만들어만 놓고 subscriber가 와서 자기자신을 이벤트에 등록하고 떠남

즉 이벤트를 감지해야하는 친구들이 와서 이벤트에 자신을 등록

 

 이벤트 사용 예시

간단한 상황: 플레이어가 라운드가 시작하기 전에 부스터팩을 사용해서 자기 자신을 부스터할 수 있음.

근데 부스터팩은 여러개를 중첩할 수 있음.

플레이어 입장에서는 부스터팩의 모든 효과들을 생각할 수 없음.

즉 부스터팩 안의 중첩된 효과들을 아무것도 모르는 상태에서 그저 부스터팩을 발동시켜야함.

이럴 때 이벤트가 필요.

 

<이벤트가 없다면>

캐릭터가 원하는 부스트를 일일이 명시해야한다는 단점이 있음.

 

<이벤트가 있을 때>

delegatge 사용

 

캐릭터입장에서는 부스트 내용 상관 안하고 그저 playerBoost를 발동시키기만 하면 됨.

 

플레이어가 부스트하는 내용물이 달라졌을 때  

이벤트를 안쓸 때는 캐릭터의 스크립트 내용물을 바꿔야했으나 지금은 그럴 필요 없음.

 

 

델리게이트로 이벤트를 만들 수 있다면 이벤트는 왜 있나?

델리게이트 변수 앞에다가 event 라는 키워드를 붙일 수 있는데 

이벤트 키워드는 델리게이트가 이벤트가 아닌 방향으로 잘못 사용되지 않도록 제한해줌

 

<event 키워드 없을 때>

 

델리게이트 자체는 public 변수임.

player.playerBoost += DamageBoost; 하지 않고

player.playerBoost = DamageBoost; 이렇게 하면 덮어쓰기가 되어버림.

즉, playerBoost에 여태까지 구독되었던 기능들이 날아가버리고 DamageBoost만 남을 수 있음.

 

즉, 이벤트란 구독자들이 자유롭게 등록하고 뺄 수 있어야 하는데 누군가가 덮어씌워서 거기 구독된 친구들이 한꺼번에 날아가면 안됨

 

<event 키워드 있을 때>

이벤트 키워드가 있을 때 덮어쓰기를 하려 하면 에러가 뜸.

구독을 하거나, 기존 구독되어있던 것을 뺄 수는 있는데 덮어쓰기는 안됨

이벤트 키워드는 델리게이트가 이벤트가 아닌 방향으로  잘못 작성될 때 그것을 막아주는 기능을 함.

 

바른 예시

 

'C#' 카테고리의 다른 글

제네릭  (0) 2021.07.21
액션 + 람다 함수  (0) 2021.07.21
델리게이트  (0) 2021.07.20
유니티 이벤트  (0) 2021.07.20
프로퍼티  (0) 2021.07.19

댓글