Study/유니티

참조 형식 & 값 형식

김조성준 2023. 7. 18. 21:29

데이터 형식에는 값 형식과 참조 형식이 있습니다.

값 형식은 변수가 값을 담는 형식이고, 참조 형식은 변수가 위치를 담는 형식입니다.

메모리의 스택 영역은 값 형식과 관련이 있고, 힙 영역은 참조 형식과 관련이 있습니다.

int main()
{	int a=10; int b=20; return 0; } 

class Program{
	Monster monster = new Monster();
}

 

main에서의 변수 a,b는 괄호가 닫히는 순간 알아서 수거해가기 때문에 데이터 유지는 되지 않지만, 메모리가 낭비가 되지 않는다는 장단점이 있습니다.

 

반면, Program 클래스의 monster는 힙 영역에 Monster 객체를 생성하였기에 데이터 유지는 되지만 CLR의 가비지 컬렉터를 이용하여 사용하지 않는 객체라고 판정하기 전까진 청소하지 못하기에 메모리적으론 불편하다는 장단점이 있습니다.

 

* CLR은 마이크로소프트에서 제공하는 가상머신으로 c# 프로그램은 CLR 위에서 실행이 됩니다.


Object와 Var은 비슷해 보이지만 차이점이 있습니다.

Object의 경우 모든 데이터 형식을 다룰 수 있습니다. 모든 데이터 형식의 부모이기 때문입니다. 

반면에 var은 해당 입력된 데이터의 값을 보고 해당 데이터가 어떤 형식의 데이터인지 판단하여 처리합니다.

object num = 10; // 여기서의 num은 object 형식으로 인식합니다.
var num = 10; // 여기서의 var은 num을 int 형식으로 인식합니다.

 

Object는 참조 형식의 데이터이지만, 값 형식을 넣어서 사용이 가능합니다. 

예를 들어, object a = 10; 같이 값 형식의 데이터를 넣는다면 박싱이라는 개념을 사용하여 값 형식을 힙에 할당시킵니다.

즉, a는 10이란 값을 담은 힙의 주소를 참조하게 됩니다. 물론, 반대 개념인 언박싱도 존재합니다.