관리 메뉴

KorSA

C# Enum 을 int 로 캐스팅하는 효율적인 방법 본문

Development Experience/C#

C# Enum 을 int 로 캐스팅하는 효율적인 방법

Praiv. 2019. 10. 2. 15:37
320x100

[ 이슈 ]

클라이언트에서 관리하고 있는 Enum 형식의 데이터들을 서버로 전송해야되서 Enum 형을 int 형으로 캐스팅하려고 한다. 이 경우 바로 캐스팅하여 (int)EnumKind.EnumData1; 처럼 사용하면 될 것 같지만, Enum 형을 바로 int로 캐스팅할 경우 성능 저하가 발생한다. 성능저하를 최대한 줄이면서 캐스팅할 순 없을까?

 

[ 배경 지식 ]

1. 박싱 / 언박싱

 

C#에서는 데이터 형식을 값 형식과 참조 형식으로 나눈다.

값 형식은 스택 영역에 데이터가 생성되고, 참조 형식은 힙 영역에 데이터가 생성되는 차이점이 있다.

 

박싱이란 값 형식을 참조 형식으로 변환하는 행위이고 (스택 영역의 데이터를 힙 영역으로 복사),

언박싱은 반대로 참조 형식을 값 형식으로 변환하는 행위이다. (힙 영역의 데이터를 스택 영역으로 복사)

 

바로 이 박싱 과정에서 메모리(힙 영역) 할당이 일어나고, 이로 인해 GC가 해당 메모리에 대한 불필요한 추적 작업을 시작한다. 고작 캐스팅하나 하려고 GC까지 움직이는 것이다.

 

참고> https://grayt.tistory.com/87

 

2. Expression Class

C#에서는 Expression Class를 제공하여 개발자가 식 트리를 객체화하여 사용할 수 있게 해준다.

식 트리란 우리가 사용하는 식(a + b, c = d + e - f, ...)들을 분해하여 트리 형태로 만든 개념이다.

식 트리는 컴파일러 등을 만들 때 사용된다.

 

참고> https://qzqz.tistory.com/234

 

 

[ 해결 방안 ]

C#의 Expression 클래스를 사용하여 박싱 / 언박싱이 없는 캐스팅을 구현한다.

이와 관련한 스택 오버플로우 글을 참조하였다.

 

참고> https://stackoverflow.com/questions/1189144/c-sharp-non-boxing-conversion-of-generic-enum-to-int

728x90
728x90
Comments