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 |