4/18: 까지 | 복싱 – 언박싱의 개념. Generic을 사용하는 이유

복싱 – 언박싱의 개념

using System;
using System.Collections;
using System.Collections.Generic;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string() args)
        {
            Queue queue1 = new Queue();
            Queue<string> queue2 = new Queue<string>();

            // 1
            queue1.Enqueue(10);

            //2
            queue2.Enqueue("10");

            // 3
            var result = queue1.Dequeue();

            // 4 
            var reuslt = queue2.Dequeue();
            Console.WriteLine($"{result} {reuslt}");
            Console.ReadLine();
        }
    }
}


권투?


그림으로 1번 설명하기

//1
queue1.Enqueue(10);

큐를 선언할 때 유형을 지정하지 않았으므로 기본적으로 개체 유형이 지정됩니다.

컴파일 시 값은 10입니다. 권투 힙에 저장하고 queue1이 해당 힙의 주소를 가리킵니다.

//2
queue2.Enqueue("10");

문자열만 가질 수 있는 Queue queue2를 선언했으므로 문자열 형식입니다.

문자열 큐 queue2에 10을 넣고 스택에 넣습니다.


언박싱?

//3
var result = queue1.Dequeue();

var 형태의 결과를 선언하고 값을 지정합니다.

데이터를 대기열에서 빼면 이스케이프된 객체 주소는 새로 선언된 객체 주소에만 할당됩니다. 언박싱이것은 일어나지 않습니다.

컴파일할 때 컴파일러는 결과의 형식을 유추하고 개체 결과로 인식합니다.

//4
var reuslt = queue2.Dequeue();

var 유형의 reuslt를 선언하고 컴파일하면 문자열 reuslt가 됩니다.

문자열 유형 객체 reuslt에 10을 넣고 스택에 넣습니다.


boxing/unboxing이 발생하는 경우

값 유형 변수로 박스형 값이 있는 변수에 저장하려고 하면 언박싱이 발생합니다.

※ boxed 값만 unboxing 가능합니다.

var 유형이 컴파일되고 컴파일러가 유형을 유추하고 인식합니다.

예)

개체 a = 20;
정수 b = (정수)a;
권투
언박싱
객체 a = “20”;
b = (문자열)a;
엑스
엑스
개체 a = 20;
객체 b = (객체)a;
권투
엑스