내일배움캠프_Unity_6기/TIL(Today I Learend)
TIL : 2024-10-01(화) :: C# 문자열 변수를 enum 자료형으로 형변환하기,박싱/언박싱을 지양해야되는 이유
BirdHead
2024. 10. 1. 23:12
Q. enum 으로 형변환이 가능해?
A. Enum.Parse()를 사용하면 변경이 가능하다.
주로, 지금 표시되어있는 함수를 주로 사용하고있는데
internal class Program
{
internal enum EnemyType
{
None = 0,
Skeleton = 1,
Goblin,
Orc,
Crab,
Turtle,
End,
}
static void Main(string[] args)
{
string _str = "Skeleton";
//Enum.Parse()의 반환값은 object 타입이기 때문에 언박싱을해줘야한다.
//언박싱 : 사용하는 타입으로 형변환 하는것
EnemyType _enemyType = (EnemyType)Enum.Parse(typeof(EnemyType), _str);
}
}
하지만 boxing/unboxing(박싱/언박싱)은 최적화에서는 지양해야 되는 기법중 하나이다.
Q.박싱과 언박싱을 왜 지양해야되는데?
A.
박싱과 언박싱은 내부적으로 상당한 오버헤드를 감수하고 사용
박싱
-박싱 순서-
1) 힙 영역에 새로운 메모리를 할당하고,
2) 스택의 값을 힙 메모리로 복사한 뒤
3) 힙 메모리의 주소 값을 갖는 새로운 스택 메모리를 할당하는 과정을 거친다.
박싱은 값 하나 옮기는데 메모리 참조를 많이 하는데, 이로 인해 시간적 오버헤드가 발생한다.
언박싱의 경우도 위와 비슷한 순서로 진행한다.
하지만 언박싱은 새로운 문제를 야기하는데, 바로 가비지를 생성한다는 것이다.
즉 언박싱은 그 자체로도 오버헤드가 있지만 가비지를 생성함으로 인해 GC를 동작시키는 잠재적 오버헤드까지 가진 셈이다.
Q.그럼 박식/언방식의 대안은 있어?
A. 제네릭을 사용하면 박싱 문제를 해결하여 사용 할 수있다.
p.s 박싱/언박싱 관련 정보는 해당 블로그를 참고하여 작성하였으며 , 해당 블로그의 글을 참고하는것이 좋다.
[C#] 박싱(Boxing)과 언박싱(Unboxing)이란?
박싱(Boxing)과 언박싱(Unboxing)의 기본 개념과 사용법, 특징을 정리한다.
velog.io