본문 바로가기
Program Language/C#

Part1. C# 첫발 내딛기(31. object 타입)

by 토담이아빠 2023. 1. 30.

Object 타입

 

C#에서의 모든 형식은 Object로부터 상속됩니다. 값 형식이나 참조 형식, 사용자 정의 형식 모두 Object로부터 상속됩니다. 따라서 Object는 모든 형식으로 변환이 가능합니다. 물론 그 반대도 가능합니다. 이번 포스팅에서는 Object의 이런 특성에 대해서 정리했습니다.


object 타입의 박싱(Boxing)과 언박싱(Unboxing)

 

Object 또는 object는 어떠한 값이라도 할당받을 수 있습니다. 값 형식의 변수가 object 타입으로 변환되는 것을 박싱(Boxing)이라고 합니다. 반대로 object타입이 값 형식으로 변환되는 것을 언박싱(Unboxing)이라고 합니다. 언박싱의 경우 (int)object와 같은 명시적인 캐스팅이 필요합니다. 다음은 박싱과 언박싱의 예를 보여줍니다.


int a = 10;
object obj = a;   //박싱(Boxing)
int b = (int)obj; //언박싱(Unboxing)

object 타입은 참조형식이기 때문에 박싱할 경우 힙에 데이터가 저장됩니다. 반면 int나 float같은 타입은 값 형식이기 때문에 언박싱할 경우 스택에 저장됩니다. 이렇게 서로 저장되는 영역이 다르기 때문에 각각 다른 값을 저장할 수 있습니다.

다음은 이에 대한 예제를 보여줍니다.


using System;

namespace Object_exam
{

    internal class Program
    {     
        static void Main(string[] args)
        {
            int a = 10;
            object obj = a;   // a값을 박싱하여 obj로 복사합니다.
            a = a + 20;     // a의 값을 변경합니다. obj는 변하지 않습니다.
            int b = (int)obj; // obj의 값을 언박싱하여 b로 복사합니다.

            // a의 값이 변해도 obj에 저장된 값은 영향을 받지 않습니다.
            Console.WriteLine($"The value-type value a = {a}");
            Console.WriteLine($"The object-type value obj = {obj}");
            Console.WriteLine($"The object-type value b = {b}");

            object c = obj;
            obj = 30;
            Console.WriteLine($"The object-type value obj = {obj}");
            Console.WriteLine($"The object-type value c = {c}");
        }
    }
}

결과

The value-type value a = 30
The object-type value obj = 10
The object-type value b = 10
The object-type value obj = 30
The object-type value c = 10


[Review]
"초보자를 위한 C# 200제(2판)" / 저자 : 강병익

댓글