Unity And C#/문법

C# 참조해야 할 때 사용할 수 있는 ref와 out

khjtoy 2023. 1. 28. 00:56

유니티로 게임을 개발하고 있던 중 함수 매개변수를 참조형 변수로 사용을 했어야 했습니다.. 저는 평소 C++에서

사용하는 참조형 변수(&)를 사용하여 문제를 해결하려 했습니다.

class Program
    {
        static void Fun(int& num)
        {
            num = 3;
        }
        static void Main(string[] args)
        {
            int a = 5;
            Fun(a);
            Console.WriteLine(a);
        }
}

위 코드처럼 쓰니 프로그램이 정상적으로 작동하지 못하고 오류가 발생했습니다.
그래서 저는 C#의 참조형 변수를
선언하는 방법을 찾아보니 ref 또는 out을 사용하면 된다고 하였습니다.


ref와 out의 공통점

    class Program
    {
        static void Fun(ref int num)
        {
            num = 3;
        }
        static void Main(string[] args)
        {
            int a = 5;
            Fun(ref a);
            Console.WriteLine(a);
        }
    }
    class Program
    {
        static void Fun(out int num)
        {
            num = 3;
        }
        static void Main(string[] args)
        {
            int a = 5;
            Fun(out a);
            Console.WriteLine(a);
        }
    }
3

첫번째 코드는 ref로 두번째 코드는 out으로 참조를 하였습니다. 둘다 a를 참조를 하여
다른 함수에서 a의 값을
바꿀 수 있습니다. 그럼 둘의 차이점이 뭘까요?


ref와 out의 차이점

    class Program
    {
        static int Fun(ref int num)
        {
            int a = num;
            a++;
            return a;
        }
        static void Main(string[] args)
        {
            int a = 3;
            Console.WriteLine(Fun(ref a));
        }
    }
4
    class Program
    {
        static int Fun(out int num)
        {
            int a = num;
            a++;
            return a;
        }
        static void Main(string[] args)
        {
            int a = 3;
            Console.WriteLine(Fun(out a));
        }
    }

첫번째 ref를 사용한 코드는 아무런 문제없이 참조가 되어 잘 실행되지만 2번째 코드인
out을 사용한 코드는
오류가 나 실행이 되지 않습니다.
그러면 out은 어떻게 코드를 작성해야지 실행될까요?

 

    class Program
    {
        static int Fun(out int num)
        {
            num = 5;
            num++;
            return num;
        }
        static void Main(string[] args)
        {
            int a;
            Console.WriteLine(Fun(out a));
        }
    }
6

위 코드처럼 작성하여 out을 사용하면 제대로 실행이 됩니다.
이러한 코드를 보면서 어떠한 차이점이 있는지
알 수 있습니다.

ref
매개 변수를 사용하기 전에는 무조건 초기화를 해줘야합니다.
함수 내에서 참조한 매개 변수의 값을 바꾸지 않아도 됩니다.
out
매개 변수로 전달하기 전에 값을 초기화할 필요가 없습니다.(모든 초기 값이 함수 내에서 무시)
함수 내에서 참조한 매개 변수의 값을 무조건 초기화해줘야합니다.