C#/문법 정리

C# - object 타입과 박싱(Boxing),언박싱(Unboxing)

Khadra 2024. 7. 27. 08:03

C#에서 모든형식은 상관없이 모두 Object로부터 상속된다.

  • 기본형식
  • 사용자가 정의한 형식
  • 값형식
  • 참조형식

object 타입

  • 모든 데이터의 조상
  • object 타입의 변수에는 어떠한 값이라도 할당가능하다.
  • Objcet와 object는 같은 말이다.
  • 참조형식이기 때문에 힙에 데이터를 할당한다.
    • 반면 int나 double와 같은 값 형식의 자료는 스택에 데이터를 할당한다.

박싱(Boxing)

  • 값형식의 변수가 objcet 타입으로 변환되는 것이라 한다.

언박싱(Unboxing)

  • object 타입의 변수가 값형식으로 변환되는 것이라 한다.
  • object에서 값형식을 꺼내는 것이다.
  • (int)와 같이 형식변환을 위한 캐스팅이 필요하다.

값형식의 변수를 박싱할 경우

  • object로 포장해서 힙에 저장하게 된다.

예제 코드

변수와 박싱된 object는 서로 다른 메모리 영역을 사용하기 때문에 다른 값을 저장할 수 있다는 것을 알 수 있다.

using System;
using static System.Console;//Console단어를 생략(코드길이줄어둠)
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //int 변수 i를 선언하고, 123의 값을 할당한다.
            //i의 값 형식의 변수이다.
            int i = 123;

            //object o를 선언하고 i의 값을 할당한다.
            //i의 값을 박싱하여 o로 복사한다.
            //i의 값이 스택영역에 위치하고, o는 힙영역에 위치한다.
            object o = i;

            //i의 값을 바꾼다. o는 변하지 않는다.
            i = i + 10;

            //o의 값을 int형 변수 j에 할당한다.
            //(int)로 캐스팅해야 한다.
            int j = (int)o;//o의 값을 언박싱하여 j로 복사한다.

            //i, o, j의 값을 출력한다. 
            //i의 값이 변해도 o에 저장된 값은 영향을 받지 않는다.
            WriteLine("The value-type value i = {0}", i);
            WriteLine("The object-type value o = {0}", o);
            WriteLine("The value-type value j = {0}", j);

            //object p를 선언하고, o를 할당한다.
            object p = o;

            //o에 숫자 100을 박싱하여 할당한다.
            o = 100;

            //o의 값과 p의 값을 출력한다.
            WriteLine("The object-type value o = {0}", o);
            WriteLine("The object-type value p = {0}", p);
        }
    }
}

결과

The value-type value i = 133
The object-type value o = 123
The value-type value j = 123
The object-type value o = 100
The object-type value p = 123

'C# > 문법 정리' 카테고리의 다른 글

C# - 무한루프와 break문  (0) 2024.08.06
C# - if~else 조건문  (0) 2024.07.28
C# - Nullable형  (0) 2024.07.19
C# - 변수의 초기화와 default  (0) 2024.07.18
C# - Null 조건 연산자(Conditional Operator, ?)  (0) 2024.07.17