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이란 값을 담은 힙의 주소를 참조하게 됩니다. 물론, 반대 개념인 언박싱도 존재합니다.