Unity & C#

[C# 문법] Reference Type 과 Value Type의 차이점

왼손잡이개발자 2021. 11. 14. 02:18

 

 

 

 

 

혹시 Reference Type과 Value Type에 대해서 들어보셨나요? 저도 막연하게 이론적으로만 알고 있다가 개발을 하면서 "아 이래서 Reference Type 이고 이래서 Value Type 이군아!' 라고 확 와닿은 이후로 좀 더 잘 이해하게 되었습니다. 번역 그대로 하면 Reference Type은 참조 타입이고 Value Type은 값 타입이라는 건데, 그렇다면 차이점은 뭘까요?

 

Class 와 Struct의 차이점들 중에 하나가 바로 Class는 Reference Type 이고 Struct은 Value Type 입니다. 함수에 파라미터로 각각의 타입을 넘기는 상황을 보면 보다 쉽게 이해 할 수 있습니다. 

using UnityEngine;

public class ReferenceExample
{
	public int number;
}

public struct ValueExample
{
	public int number;
}

public class ReferenceAndValue : MonoBehaviour
{
	private ReferenceExample myReference = new ReferenceExample();
	private ValueExample myValue = new ValueExample();

	private void Start()
	{
		ChangeReference(myReference);
		ChangeValue(myValue);



		print("MyReference number is : " + myReference.number); //output : 10
		print("MyValue number is : " + myValue.number); // output : 0
	}

	public void ChangeReference(ReferenceExample referenceType)
	{
		referenceType.number = 10;
	}

	public void ChangeValue(ValueExample valueType)
	{
		valueType.number = 10;
	}
}

ChangeReference(...)와 ChangeValue(...)를 통해 파라미터로 받아온 ReferenceType과 ValueType의 number 변수를 10으로 바꿔줬는데, 결국 print() 했을 때 output은 Refernce Type의 number 만 10으로 바뀌어있고, ValueType의 number 는 0으로 바뀌지 않은 것을 볼 수 있습니다.

 

Reference Type과 Value Type의 차이는 메모리상에서 데이터 값이 어떻게 저장되냐에 따라서 나누어지게 됩니다. Reference는 데이터 값이 저장되어있는 곳의 주소를 저장하고, Value는 실제 데이터값이 저장이 됩니다. 따라서 위에 예제 코드에서 함수의 파라미터로 넘겨진 Reference Type의 변수는 주소 자체를 받아온 것이라 함수안에서 number변수를 수정했을 때 주소가 가르키는 실제 데이터를 수정 할 수 있었던 것입니다.

 

또한, int나 float 처럼 Value Type 인 데이터 타입도 Array 일 경우엔 무조건 Reference Type이라고 합니다! (이것 때문에 최근 개발할 때 너무 시간을 낭비했었습니다....ㅠㅠ)

아래 링크에서 Reference Type과 Value Type의 대표적 종류들과 좀 더 세부적인 설명을 볼 수 있습니다.

링크: https://www.tutorialsteacher.com/csharp/csharp-value-type-and-reference-type