복싱 – 언박싱의 개념
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
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; |
권투 엑스 |