이벤트 사용 이유: 두 오브젝트 사이에 커플링이라고 부르는 직접도를 없애기 위해서
이벤트는 기본적으로 publisher와 subscriber로 나눠서 두개 사이의 커플링을 낮춰주고 동시에 델리게이트를 사용할 때 이벤트란 키워드를 사용하면 좀 더 엄격하게 델리게이트를 이벤트에 맞춰 사용할 수 있단 얘기!
커플링: 두 오브젝트가 잘 알고지내고 하드하게 연결되어있는 정도
커플링이 심하다: A, B 오브젝트가 서로 심하게 엮어있어서 A가 없어지면 B가 영향을 받기 떄문에 코드를 수정하기 쉽지 않다는 것.
코드를 깔끔하게? : 커플링을 줄이는데 집중
publisher : 어떤 이벤트를 쥐고 발동 시키는 측
subscriber : 어떤 이벤트에 자기 자신의 기능을 등록시켜놓고 대기하는 측
publisher은 이벤트를 만들어만 놓고 subscriber가 와서 자기자신을 이벤트에 등록하고 떠남
즉 이벤트를 감지해야하는 친구들이 와서 이벤트에 자신을 등록
이벤트 사용 예시
간단한 상황: 플레이어가 라운드가 시작하기 전에 부스터팩을 사용해서 자기 자신을 부스터할 수 있음.
근데 부스터팩은 여러개를 중첩할 수 있음.
플레이어 입장에서는 부스터팩의 모든 효과들을 생각할 수 없음.
즉 부스터팩 안의 중첩된 효과들을 아무것도 모르는 상태에서 그저 부스터팩을 발동시켜야함.
이럴 때 이벤트가 필요.
<이벤트가 없다면>
캐릭터가 원하는 부스트를 일일이 명시해야한다는 단점이 있음.
<이벤트가 있을 때>
delegatge 사용
캐릭터입장에서는 부스트 내용 상관 안하고 그저 playerBoost를 발동시키기만 하면 됨.
플레이어가 부스트하는 내용물이 달라졌을 때
이벤트를 안쓸 때는 캐릭터의 스크립트 내용물을 바꿔야했으나 지금은 그럴 필요 없음.
델리게이트로 이벤트를 만들 수 있다면 이벤트는 왜 있나?
델리게이트 변수 앞에다가 event 라는 키워드를 붙일 수 있는데
이벤트 키워드는 델리게이트가 이벤트가 아닌 방향으로 잘못 사용되지 않도록 제한해줌
<event 키워드 없을 때>
델리게이트 자체는 public 변수임.
player.playerBoost += DamageBoost; 하지 않고
player.playerBoost = DamageBoost; 이렇게 하면 덮어쓰기가 되어버림.
즉, playerBoost에 여태까지 구독되었던 기능들이 날아가버리고 DamageBoost만 남을 수 있음.
즉, 이벤트란 구독자들이 자유롭게 등록하고 뺄 수 있어야 하는데 누군가가 덮어씌워서 거기 구독된 친구들이 한꺼번에 날아가면 안됨
<event 키워드 있을 때>
이벤트 키워드가 있을 때 덮어쓰기를 하려 하면 에러가 뜸.
구독을 하거나, 기존 구독되어있던 것을 뺄 수는 있는데 덮어쓰기는 안됨
이벤트 키워드는 델리게이트가 이벤트가 아닌 방향으로 잘못 작성될 때 그것을 막아주는 기능을 함.
바른 예시
댓글