복사와 참조에 대해 알아보자
- 변수에 실제 값이 저장되고, 대입이나 메서드 호출 시 값이 복사 된다.
- 함수 인자 전달 : 메서드 내부에서 수정하면 원본에 영향이 없다.
- 대표적인 예시로는 int, float, bool, enum, struct (Vector3, Quaternion).
void ChangeNum(int x)
{
x = 10;
}
void start()
{
int a = 1;
ChangeNum(a);
Debug.Log(a);
}
이러한 함수가 있다고 가정할 때, a의 값은 변하지 않는다.
- a변수는 메모리 어딘가에 5라는 값을 저장하고 있다.
(예: 주소 0x100 -> 값 5)- ChangeNumber(a) 호출 시, a의 값인 5가 복사되어 새 변수 x에 저장된다
(예: 주소 0x200 -> 값 5)
함수 안에서 x = 10; 해도 0x200의 값만 바뀌고 0x100은 그대로이다.
즉 함수 종료시 x는 스택에서 사라지고 a는 영향이 없다.
- 변수에 객체가 위치한 메모리 주소가 저장된다.
- a = b;를 하게되면 a와 b가 같은 객체를 가리킨다.
- 함수 인자 전달 : 전달되는 것은 참조의 복사. 함수 내부에서 객체의 멤버를 변경하면 원본에 반영된다.
- 예시로는 class, List, Dictionary, GameObject, MonoBehaviour 등.
class MyClass { public int value; }
void ChangeValue(MyClass data)
{
date.value = 10;
]
void start()
{
MyClass.a = new MyClass { value = 5 };
ChangeValue(a);
Debug.Log(a.value);
}
여기서 a는 MyClass의 주소가 저장되어 있다.
함수에 a를 전달하면 그 주소값이 복사되지만, 복사된 주소가 같은 객체를 가리키고 있으므로
함수 안에서 객체의 멤버(value)를 수정하면 원본에도 영향이 간다.