-
4/18 : TIL | Object, 참조/값 형식, 박싱 - 언박싱의 개념Today I Learned/C# 2023. 4. 18. 17:05728x90
Object
C#의 데이터 형식은 크게 4가지이다. 숫자, 논리, 문자열, 오브젝트 형식이 있다.
이 중 특별하게 Object 형식은 영단어 뜻 '객체' 그대로 어떤 데이터든지 다룰 수 있는 형식이다.
Object가 특별한 이유는 '상속' 효과 덕분이다. 모든 데이터 형식은 Object로 부터 상속받는다. (기본이 Object)
//데이터의 형식에 상관없이 모두 object에 담을 수 있다. object a = 123; object a = "123"; object a = 1.23; object a = true;
이게 가능한 이유는 Object 가 참조형식이기 때문이라는데, 참조가 뭔지 알아보자.
참조 형식과 값 형식
String과 Object만 참조 형식이다. 다른 모든 형식(int, bool, char..등)은 모두 값 형식이다.
값 형식은 변수가 값을 담고 있는 데이터 형식이며,
참조 형식은 변수가 값 대신 값이 있는 곳의 위치(주소)를 담는 데이터 형식이다.
※ 추가로 참조 형식만 Null 값을 가질 수 있다.
값 형식이 Null값을 갖고 싶다면, int? a; 와 같이 ?를 붙여 nullable하게 만들어줄 수 있다.
(참고) 그림 위주로 보기
[유니티 C#] 박싱과 언박싱
Boxing, Unboxing
velog.io
박싱 - 언박싱의 개념
우선, 박싱이 된 값이어야 언박싱이 가능합니다.
참조 => 값 (박싱)
값 => 참조(언박싱)object a = 20;
int b = (int)a;박싱
언박싱object a = "20";
string b = (string)a;X
Xobject a = 20;
object b = (object)a;박싱
X
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. Queue는 형식을 지정하지 않아 기본값인 object형식. 컴파일하면 10이라는 값을 박싱해 힙에 저장하고 queue1은 그 힙의 주소를 가리키게 한다.
2. string형식으로 지정된 queue2는 string인 "10"의 주소를 바라본다. 이 때 참조형식에 참조형식의 값을 복사하려 하기 때문에 박싱은 일어나지 않는다.
3. 데이터를 dequeue해서 빠져나온 object 주소를 새로 선언한 result 도 바라본다. 따라서 언박싱은 따로 일어나지 않는다. var이기 때문에 컴파일러가 형식을 유추한다.
4. reuslt는 string인 queue.Dequeue();의 주소를 바라본다. var이기 때문에 컴파일러가 형식을 유추한다.
'Today I Learned > C#' 카테고리의 다른 글
4/19 : TIL | 메소드 Method, 매개변수와 인수, ref out (0) 2023.04.19 4/18 : TIL | 확장메서드, namespace class method 이해 (0) 2023.04.18 4/17 : TIL | [구름LEVEL 1단계] 고장난 컴퓨터 / 문제추천안함.. (0) 2023.04.17 4/17 : TIL | [구름 LEVEL 1단계] 정사각형의 개수 (0) 2023.04.17 4/17 : TIL | [구름Level 1단계] 헷갈리는 작대기 / 정규식 사용해 특수문자 찾기 (0) 2023.04.17