ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#] Boxing / Unboxing에 대하여 Araboza.
    Language/C# 2020. 9. 19. 22:50

    Boxing이란?

    Boxing은 값 형식을 object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 프로세스입니다. CLR(공용 언어 런타임)은 값 형식을 boxing할 때 값을 System.Object 인스턴스 내부에 래핑하고 관리되는 힙에 저장합니다. unboxing하면 개체에서 값 형식이 추출됩니다. Boxing은 암시적이며 unboxing은 명시적입니다. Boxing 및 unboxing의 개념은 개체로 처리할 수 있는 모든 값 형식에서 형식 시스템의 C#에 통합된 뷰의 기반이 됩니다.

    [출처] docs.microsoft.com

    C#에서는 데이터 유형은 값 형식 과 참조 형식이 존재합니다.
    데이터 유형으로 사용하는 int, double, float, bool, char는 값 형식, string과 ArrayList, 클래스 는 참조 형식입니다.

    아래는 int(값 형식) 데이터를 object(참조 형식)으로 Boxing 하는 예제입니다.
    object 변수 o에 Boxing은 암시적으로 이루어지고 있음을 확인 할 수 있습니다.

    1
    2
    3
    4
    5
    6
    7
    int i = 123;
     
    //Boxing
    object o = i;
     
     
     
    cs

     

    아래는 object(참조형식)을 int(값 형식)으로 Unboxing 하는 예제입니다.
    object 변수 o를 int로 Unboxing 시 명시적(int를 지정)하여 수행함을 확인 할 수 있습니다.
    만약, int가 아닌 다른 데이터 타입(short, float 등)으로 Unboxing 시에는 Exception이 발생 하게 됩니다.

    1
    2
    3
    int i = 123;
    object o = i;     // Boxing
    int j = (int)o;   // Unboxing
    cs

     

    이처럼 Boxing은 암시적, Unboxing은 명시적으로 이루어짐을 확인 할 수 있습니다.

    문제는 Boxing의 경우 단순 할당에 비하여 20배 정도 오래걸리며, Unboxing의 경우 4배정도 느리기때문에 성능 이슈가 발생 할 수 있습니다.
    ArrayList와 같은 형태는 다수의 데이터가 Boxing/Unboxing이 일어날 수있기때문에 더욱더 이슈가 발생할 수 있겠죠.

    따라서 Boxing/Unboxing을 피하기 위해서 Microsoft에서는  System.Collections.Generic의 제네릭 컬렉션 사용을 권장하고 있습니다.

    다음에 포스팅에서는 제네릭 컬렉션에 대하여 설명 드리도록 하겠습니다.

     

    'Language > C#' 카테고리의 다른 글

    C# 버젼 연혁  (0) 2020.10.10
    string 과 Stringbuilder의 차이점을 Araboja  (0) 2020.09.05
    C#으로 개발된 Com dll 등록 방법  (0) 2020.06.20
    SAP RFC 연동 (C#)  (0) 2019.10.06

    댓글

2017 TIFY Team All Rights Reserved.