일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 프레임워크
- Tween
- Unity Editor
- C#
- job
- RSA
- adfit
- ui
- 가이드
- 텍스트 메시 프로
- jumping ball
- Dots
- base64
- Custom Package
- sha
- 샘플
- AES
- 커스텀 패키지
- 단말기 해상도
- TextMeshPro
- 이미지 폰트
- 2D Camera
- 다이나믹 폰트
- Job 시스템
- 최적화
- DotsTween
- Dynamic Font
- Framework
- unity
- 암호화
- Today
- Total
EveryDay.DevUp
[Unity] C# Boxing , unboxing ( 박싱, 언박싱 ) 본문
● Boxing, Unboxing 의 정의
▶ Boxing ( 박싱 ) : 값 형식을 참조 형식으로 변환하는 것을 말한다. boxing은 암시적으로 발생한다.
( 예를 들어 int, float 를 object 로 변환하는 것을 말하는데 이 과정에서 단순 참조의 20배에 해당 하는 오버헤드와 메모리의 추가 사용이 발생합니다. )
int test = 100;
object tetsObj = test;
▶ UnBoxing ( 언박싱 ) : 참조 형식을 값 형식으로 변환하는 것을 말한다. Unboxing은 명시적으로 발생한다.
( 예를 들어 object를 int, float로 변환하는 것을 말하는데 이 과정에서 일반적인 할당의 4배에 달하는 시간이 소요된다. )
int test = 100;
object testObj = test;
int i = (int)test;
● Boxing, Unboxing 이 사용되는 경우
void foo( int a ){}
void foo( int a, int b ) {}
void foo( int a, int b, int c ) {}
void foo(params object[] values) {}
▶ 동일한 함수이지만 인자의 개수가 유동적인 경우 params object[]를 사용하게 되는데 이때도 boxing이 발생한다;.
int a = 100;
Debug.Log( a );
public class Debug {
public static void Log(object message)
}
▶ 인자 타입이 object인 함수의 경우에도 사용 시에 boxing이 발생한다.
public enum STATE
{
A = 1,
B = 2,
}
private void Start()
{
STATE a = STATE.A;
STATE b = STATE.B;
// Enum 비교 시 a, b가 boxing이 발생한다
if( a.Equals( b ) ){}
int ia = 1;
int ib = 2;
// 단순 enum 비교로 boxing이 발생하지 않는다
if( ia.Equals( ib ) ){}
}
▶ 사람의 입장에서는 enum으로 값을 비교하는 것과 int로 값을 비교하는 것에는 차이가 없어 보이지만 enum을 .Equals 로 비교하게 되면 내부적으로 object 비교가 발생하여 boxing이 발생한다.
boxing은 암시적으로 사용되고 있기 때문에 주의 깊게 생각하고 사용하지 않으면 생각보다 많은 곳에서 발생하게 된다. 꼭 필요한 곳에서 사용하는 것은 어쩔 수 없지만, 불필요한 곳에서 사용하게 되는 경우 성능 저하를 발생 시키기 때문에 유의해야한다.
참고 자료 : https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/types/boxing-and-unboxing
'C#' 카테고리의 다른 글
[Unity] Struct (구조체) (0) | 2021.12.23 |
---|---|
[Unity] Namespace ( 네임 스페이스 ) (0) | 2020.06.16 |
[Unity] C# 주석 (0) | 2020.05.31 |
[Unity] C# 코딩 규칙 (0) | 2020.05.01 |
[Unity] C#에서의 메모리 (0) | 2020.04.27 |