Learning
When: 1학년 8월 19일
How:
심화반 영상에 Notify Value라는 개념이 나왔는데, 처음엔 어디에 써야 할지도 몰랐기 때문에 금방 잊혔지만 Y-Sorting을 할 때 y 값이 변할 때만 Sorting Layer를 바꾸면 좋을 것 같아서 Notify Value에 대해 공부하게 되었습니다.
Understanding:
- 정의 : Notify Value는 값이 바뀔 때마다 특정한 이벤트를 호출하여 그 값을 사용하는 것들을 업데이트 해주는 작업을 가능하게 해주는 변수를 말합니다. Hp가 바뀌면 Hp가 0이 되지는 않았는지, 체력바나 hp 텍스트 UI에 반영, 이펙트 반영 등의 작업을 해주어야 하는데, Hp가 바뀔 때마다 이런 메서드를 다 실행시키면 귀찮을 것이고, 그렇다고 실행할 곳에서 계속 Hp가 바뀌는지 검사하는 것도 상당히 귀찮고 성능에도 좋지 않기 때문에 이벤트를 호출시킵니다.
- 코드 : Notify Value는 여러 값(hp, mp, timer 등)이 쓸 수 있기 때문에 클래스로 만들어 놓으면 편한데, 아래에 코드를 쓰고 설명해 보겠습니다.
public class NotifyValue<T>
{
private T value;
public event Action<T> OnValueChanged;
public T Value
{
get
{
return value;
}
set
{
if (Equals(this.value, value)) return;
this.value =value;
OnValueChanged?.Invoke(value);
}
}
}
- 설명 : 위의 코드는 value라는 내부적으로 사용되는 변수를 만든 다음, 그 변수에 접근할 때는 Value라는 프로퍼티를 사용하는 코드입니다. 프로퍼티의 get은 일반적인 return value;이고, set에선 값이 바뀐다는 뜻이기 때문에 같은 값을 대입하려고 할 때는 이벤트를 실행하지 않도록 Equals() 메서드를 사용하여 값이 같다면 return 시키고, 값이 다를 경우 value를 바꿔준 후, 대입하려는 값을 이벤트로 호출합니다. 미리 바뀐 값을 인수로 주면 메서드에서 굳이 찾을 필요가 없기 때문에 인수로 바뀐 값을 주면 됩니다.
- 사용 : 아래의 코드는 NotifyValue를 사용하여 hpBar를 세팅할 때 예시로 쓸 수 있게 코드를 써봤는데 이렇게 생성자로 생성하고 변수의 이벤트와 Value를 사용하면 됩니다.
internal class Program
{
static void Main(string[] args)
{
NotifyValue<int> hp = new NotifyValue<int>();
hp.OnValueChanged += SetHpBar;
hp.Value += 10;
hp.Value -= 9;
}
public static void SetHpBar(int hp)
{
Console.WriteLine($"체력: {hp}");
//hpBar.value = changeAmount 하기
}
}
Result: 단순해 보이지만 이벤트도 알아야 해서 초보자 때 배우면 자연스럽게 이벤트를 사용하는 방법도 알 수 있을 것 같아 나중에 후배를 가르칠 때 써먹어봐야겠다는 생각이 들었습니다.
'C#' 카테고리의 다른 글
| [C#] 인덱서(Indexer) (0) | 2025.08.22 |
|---|---|
| [C#] where 키워드 (Generic 제한) (0) | 2025.08.20 |
| [C#] StringBuilder (1) | 2025.08.12 |
| [C#] 가비지 컬렉터 (GC) (4) | 2025.08.11 |
| [C#] 2차원 배열 (3) | 2025.08.10 |