[Unity 이론] 유니티에서 ref와 out 키워드 사용방법과 차이점

유니티 개발에서 C#의 refout 키워드는 함수 인자를 다룰 때 중요한 역할을 합니다.  이 두 키워드를 이해하고 올바르게 사용하는 것은 유니티 게임 개발의 효율성을 크게 향상시킬 수 있습니다. 이 글에서는 refout 키워드의 개념을 설명합니다.

 


1. ref 키워드

 

ref 키워드는 메서드에 변수를 참조로 전달할 때 사용됩니다. 이를 통해 메서드 내에서 인자의 값을 변경하면, 그 변경사항이 메서드를 호출한 곳에서도 반영됩니다. 즉, ref를 사용하면 메서드가 인자로 받은 변수 자체를 직접 수정할 수 있습니다.(참조로 전달한다는 것은 변수의 실제 메모리 위치를 전달한다는 의미로, 메서드 내에서 변수의 값을 변경하면 원본 변수에도 그 변경사항이 반영됩니다.)

 

아래 예제에서 보면 TakeDamage 메서드는 health 변수를 참조로 받아, 실제 변수의 값을 변경합니다. 따라서 메서드 호출 후 health 변수의 값은 70으로 감소된 것을 볼 수 있습니다.

 

using UnityEngine;

public class RefExample : MonoBehaviour
{
    void Start()
    {
        int health = 100;
        TakeDamage(ref health, 30);

        Debug.Log($"After taking damage: {health}"); // health 값은 70이 됩니다.
    }

    void TakeDamage(ref int health, int damage)
    {
        health -= damage;
    }
}

 


2. out 키워드

 

out 키워드는 메서드에서 값을 반환할 때 사용되며, 주로 메서드가 여러 값을 반환해야 할 때 유용합니다. out을 사용하는 변수는 메서드 내에서 반드시 초기화되어야 합니다.

 

아래 예제에서 보면  TryMultiply 메서드는 두 수의 곱셈 결과를 out 파라미터를 통해 반환합니다. 이 방식을 사용하면, 메서드가 성공적으로 실행되었는지를 나타내는 부울 값과 함께 추가적인 결과값을 반환할 수 있습니다.

 

using UnityEngine;

public class OutExample : MonoBehaviour
{
    void Start()
    {
        int result;
        if(TryMultiply(10, 5, out result))
        {
            Debug.Log($"Multiplication result: {result}"); // 결과는 50입니다.
        }
    }

    bool TryMultiply(int a, int b, out int result)
    {
        result = a * b;
        return true; // 단순 예제를 위해 항상 true를 반환합니다.
    }
}

 


3. ref와 out의 주요 차이점

 

  • ref는 메서드로 전달되기 전에 초기화되어야 합니다. 반면, out 파라미터는 메서드 내에서 초기화되어야 합니다.
  • ref는 기존 변수의 데이터를 메서드 내부로 가져와서 변경할 수 있도록 합니다. out은 메서드가 결과를 외부로 출력하는 데 사용됩니다.