ref와 out은 참조 매개변수로, 즉 메서드의 주소를 넘겨준다.
ref는 초기화된 변수를 넘길 때 넘겨주는 메서드 내에서 참조된 주소에 따라 값을 변경할 수 있게 하는 것이다.
선언해준 변수에 메서드의 결과를 할당하지 않고도, 메서드의 결과값을 변수에 할당할 수 있다.
using UnityEngine;
public class Test : MonoBehaviour
{
private void Start()
{
int a = 5;
Debug.Log(a);
TestRef(ref a);
Debug.Log(a);
}
private void TestRef(ref int a)
{
a = 10;
}
}//실행 결과 : 5가 출력된 이후 10이 출력된다.
out은 초기화 되지 않은 변수여도, 메서드 내에서 할당을 통해 호출해 준 곳에서 값을 받아 쓸 수 있다. 무조건 메서드 내에서 할당해 주어야 한다.
아래의 예시와 같이, out을 통해서 if문에서 작성한 조건에 대한 결과를 변수로 사용할 수 있다.
using UnityEngine;
public class Test : MonoBehaviour
{
[SerializeField]
private GameObject testObject;
private void Start()
{
int a;
TestRef(out a);
Debug.Log(a);
if(testObject.TryGetComponent<Rigidbody2D>(out Rigidbody2D rigid))
{
Debug.Log(rigid);
}
}
private void TestRef(out int a)
{
a = 10;
}
}//실행 결과 : 10이 출력된 이후 testObject가 Rigidbody2D을 가지고 있으면 Rigidbody2D를 출력해준다. 가지고 있지 않는 경우는 아무것도 출력되지 않는다.
본인 또한 ref와 out이 없기 전까지는 if문을 통해 조건을 확인하고, 다시 조건식을 이용해 변수에 할당하거나, 선언한 변수에 직접 메서드를 실행시켜줘서 결과를 변수에 할당해 주기도 하였다. 익숙하지 않더라도 ref와 out을 쓰면서 개선된 스크립트를 작성해보자.