갓똥
나는야 프로그래머
갓똥
전체 방문자
오늘
어제
  • 분류 전체보기 (186)
    • 프로그래밍 (146)
      • 자바 (9)
      • 안드로이드 (2)
      • 유니티 (20)
      • C++ (38)
      • C# (56)
      • HTML (2)
      • 파이썬 (3)
      • 자료구조 (2)
      • 알고리즘 (0)
      • 문제풀이 (4)
      • 디자인 패턴 (7)
      • 카카오톡 봇 (1)
      • 엑셀 (1)
      • 기타 (1)
    • 게임 (21)
      • 테일즈위버 (0)
      • 카이로소프트 (1)
      • 순위 (19)
      • 기타 (1)
    • 일상 (13)
      • 카페 (1)
      • 방탈출 (12)
    • 기타 (6)
      • 웃긴자료 (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • 유니티 그래프 그리기
  • 2020년 게임 매출
  • 강남 방탈출
  • C++ 상속
  • pc 게임 순위
  • c# coroutine
  • c# delegate
  • 게임매출순위
  • 알고리즘
  • 전세계게임매출순위
  • 유니티 그래프
  • 롤 골드그래프
  • C++
  • C# 예외 처리
  • 글로벌게임매출
  • C++ 소멸자
  • pc게임 순위
  • 자바
  • c# 코루틴
  • C# boxing
  • C++ virtual
  • Unity Graph
  • 전세계 게임 매출
  • 게임 디자인 패턴
  • c# Thread
  • 유니티 골드그래프
  • c# collection
  • 모바일 게임 순위
  • 게임 매출 순위
  • c# unboxing

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갓똥

나는야 프로그래머

[C#] Boxing / Unboxing (1)
프로그래밍/C#

[C#] Boxing / Unboxing (1)

2020. 2. 10. 19:20
728x90
반응형

1. 핵심 정리

using System;

class Program {
    static void Main() {
        int[] a1 = {1, 2, 3};
        object o1 = a1;
        int[] a2 = (int[])o1;
        
        Console.WriteLine(a2[0]);
    }
}

 

먼저 5~9번 라인을 보자.
먼저 int형의 배열을 만들었다. 배열은 C#에서 참조타입이므로 Heap에 생성되었을 것이다.
다음 object는 모든 타입의 기반 타입이므로 o1도 a1과 같은 Heap을 바라볼 것이다.
마지막으로 위의 obejct타입을 다시 배열로 캐스팅하여 담을 수도 있다.
그림으로 나타내면 아래와 같다.

모두 같은 메모리를 바라보기에 만약 중간에서 a1이나 o1의 값을 바꿔도 a2를 출력해보면 바뀐 값으로 출력되는 것을 볼 수 있다.

 

using System;

class Program {
    static void Main() {
        int    n1 = 1;
        object o2 = n1;
        int    n2 = (int)o2;
        
        Console.WriteLine($"{n1}, {n2}");
    }
}

 

이번엔 다른 경우를 살펴보자.
int는 값 타입이므로 n1과 실제 값은 stack에 생성될 것이다.
그런데 object는 참조 타입이다. stack에는 참조변수가 생성되고 Heap을 가르켜야 하는데
n1은 스택에 있으므로 어딜 가르켜야 할지 모른다.
이럴 때, stack에 있는 n1객체가 heap에 복사본을 만들고 o2가 그 복사본을 가리킨다.
이러한 현상을 Boxing이라고 한다.
반대로 n2는 값 타입이므로 다시 복사본이 stack으로 오게되고 이를 Unboxing이라고 한다.
따라서 중간에 값을 바꿔도 나머지에 영향을 미치지 않는다.
그림으로 나타내면 아래와 같다.

당연히 복사본을 만들기 때문에 Boxing, Unboxing이 사용되면 성능저하가 생긴다.
다음으로 Boxing, Unboxing을 피하기 위한 코딩방법을 알아보자.
728x90
반응형

'프로그래밍 > C#' 카테고리의 다른 글

[C#] Boxing / Unboxing (3)  (1) 2020.02.11
[C#] Boxing / Unboxing (2)  (1) 2020.02.11
[C#] casting  (0) 2020.02.07
[C#] Elvis Operator (?, ??) 연산자  (0) 2020.02.06
[C#] Nullable<T>  (0) 2020.02.04
    '프로그래밍/C#' 카테고리의 다른 글
    • [C#] Boxing / Unboxing (3)
    • [C#] Boxing / Unboxing (2)
    • [C#] casting
    • [C#] Elvis Operator (?, ??) 연산자
    갓똥
    갓똥
    공부하며 알아가는 내용을 정리해 봅니다.

    티스토리툴바