enum과, struct는 값 타입이기 때문에 힙에 할당을 하지 않으므로 가비지가 생성되지 않는다.
하지만 Dictionary를 사용함으로써 enum이나 struct를 key로 사용할 경우 가비지가 발생되게 된다.
이유는 Dictionary에서는 키값이 같은지 여부를 판단할 때 System.Collections.Generic 네임스페이스 내부에 존재하는 IEqualityComparer 인터페이스를 사용하는데
따로 Dictionary에 비교자 객체를 집어 넣지 않는다면 비교자 객체의 기본값은 EqualityComparer<T>.Default가 되고 이 Default 프로퍼티는 T타입이 System.IEquatable<T>을 따로 구현하지 않았을 경우에 EqualityComparer<T>를 반환하는데, 얘는 Object.Equals, Object.GetHashCoe를 기본 비교 함수들로 사용한다는 것이다.
enum과 struct는 비교 함수들이 따로 구현되어 있지 않기 때문에 key로 사용하게되면
결국 저 두 함수를 통하여 enum이든 struct든 값이 object로 박싱이 되버리니 가비지가 생기게 된다는 것이다.
해결책은 EqualityComparer<T> 인터페이스를 상속받는 클래스를 선언해서 비교하게 하는 방법이다
이것은 struct나, enum 똑같다.
public enum SomeType
{
EnumA = 1,
EnumB = 2,
}
public class SomeTypeComparer : IEqualityComparer<SomeType>
{
bool IEqualityComparer<SomeType>.Equals(SomeType a, SomeType b) { return a == b; }
int IEqualityComparer<SomeType>.GetHashCode(SomeType obj) { return (int)obj; }
}
위와 같이 IEqualityComparer<T> 인터페이스를 상속받는 클래스를 선언하고
Dictionary 인스턴스를 생성할때 생성자에 인스턴스를 넣어주면 된다.
Dictionary<SomeType, int> dic = new Dictionary<SomeType, int>(new SomeTypeComparer());
'Unity' 카테고리의 다른 글
유니티 - sRGB, Linear, Gamma 컬러 스페이스 (0) | 2023.05.31 |
---|---|
C# string.format, stringbuilder (0) | 2021.07.23 |
유니티 - 프로파일러 (Profiler) (0) | 2021.07.23 |
유니티 2019 - 모바일 알림 (0) | 2021.07.23 |
유니티 - 캐시 서버 (Cache Server) (0) | 2021.07.23 |