Q. enum 으로 형변환이 가능해?

A. Enum.Parse()를 사용하면 변경이 가능하다. 

함수 오버로딩이 8가지 되어있다.

 

주로, 지금 표시되어있는 함수를 주로 사용하고있는데 

 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 박싱/언박싱 관련 정보는 해당 블로그를 참고하여 작성하였으며 , 해당 블로그의 글을 참고하는것이 좋다.

https://velog.io/@wjdgh9577/C-%EB%B0%95%EC%8B%B1Boxing%EA%B3%BC-%EC%96%B8%EB%B0%95%EC%8B%B1Unboxing%EC%9D%B4%EB%9E%80

 

[C#] 박싱(Boxing)과 언박싱(Unboxing)이란?

박싱(Boxing)과 언박싱(Unboxing)의 기본 개념과 사용법, 특징을 정리한다.

velog.io

 

+ Recent posts