타입

데이터 타입은 값(Value)타입과 참조(Reference)타입으로 나뉜다.

값 타입

Int, Float, Bool , struct, enum 등이 값 타입이다.
변수가 스택에 값 그대로를 할당한다.
new 없이 선언과 동시에 값을 할당할 수 있다.
값 타입은 복사를 하면 값 그 자체가 복사된다.

int a = 10;
int b = 20;
b = a;

debug.Log($"a : {a}");
debug.Log($"b : {b}");

-------------------------------
Log: 
a : 10
b : 10

참조 타입

Class, String , array 등은 참조 타입이다.
변수가 힙에 값이 있는곳의 위치를 할당한다.
참조타입을 사용하기 위해서는 New를 사용해서 초기화 후, 힙에 할당된 메모리를 스택 공간에서 참조해야한다.
참조타입은 복사를 하더라도 그 값이 복사가 되는게 아니라 그 값이 있는곳의 위치가 복사된다.

예시를 이렇게 드는게 맞는지는 모르겠다.

  a = new classTest();
        a.classInt = 10;
        b = a;
        Debug.Log($"a:{a.classInt} b:{b.classInt}");

        b.classInt = 30;

        Debug.Log($"a:{a.classInt} b:{b.classInt}");

-------------------------------
Log: 
a:10 b:10
a:30 b:30

b.classInt = 30; 부분에서
b의 값을 바꿔준게 아니라, b의 위치에 가서 그 값을 30으로 바꿔준것.
근데 그 위치는 a의 위치니까? a도 30으로 나온다..

 


박싱과 언박싱은 일종의 형변환이다.

우선 박싱과 언박싱은 지난 글 값타입, 참조타입에 이어지는 내용이다. 이 한줄은 꼭 기억하자.

값타입은 스택에, 참조타입은 힙에 저장되어있다.

Boxing(박싱)

값타입의 객체를 참조타입으로 변환하는 작업.

int exValue = 100;
object exRef = exValue;

int는 값타입이고, object는 참조타입이다.
위의 코드에서는 참조타입 exRef에 값 타입 exValue을 대입하였다.

스택영역에 있는 exValue값이 exRef로 변환되면서 , 힙영역에 object 형식으로 선언되며 복사되었다.
exRef는 스택영역에 존재하며 , boxed된 exValue의 주소값을 가지고있다.

UnBoxing(언박싱)

참조타입의 객체를 값형식으로 변환하는 작업.

int exValue = 100;
object exRef = exValue;
int exSecondValue = (int)exRef;

한번 박싱한 exRef를 다시 int타입인 exSecondValue에 넣고있다.

언박싱을 할때는 다른타입으로 하거나 해당 타입보다 작은 범위로 변환을 할때는 오류가 발생한다.
그래서 is 연산자를 이용해서 미리 확인을 해야한다.

정리

박싱에는 값을 단순히 참조에 할당하는것보다 최대 20배의 시간이, 언박싱은 할당의 4배의 시간이 소모된다고 한다.
되도록 제네릭을 사용해서 박싱,언박싱을 피해야한다.

참조 https://hongjinhyeon.tistory.com/90

 

[C#] 박싱 과 언박싱 (Boxing & UnBoxing)

일반적인 프로그램을 만들면 이 개념에 대해서 몰라도 개발은 가능합니다.그러나 사용되는 메모리가 많거나 관리가 필요하다면 필수적으로 알아야할 내용입니다. 1.박싱(Boxing) 값타입을 Object

hongjinhyeon.tistory.com

 


작성일: 2022년 12월 9일

'아카이브 > 개발,공부' 카테고리의 다른 글

유니티,깃 협업 환경 세팅 (팀원 공유용)  (0) 2026.05.12
객체지향 프로그래밍  (0) 2026.05.12
Generic  (0) 2026.05.12
상속, Virtual , Abstract, Interface  (0) 2026.05.12
UnityWebRequest 정리  (0) 2026.05.12

+ Recent posts