스토리지

[3.12] Call by Value & Call by Reference 본문

Unity/수업내용(C#)

[3.12] Call by Value & Call by Reference

ljw4104 2021. 3. 12. 10:12

1. Call by Value

class Program
    {
        static void Main(string[] args)
        {
            int a = 5;
            int b = 7;
            swap(a, b);
            Console.WriteLine("In Main a : {0}, b : {1}", a, b);
        }

        static void swap(int a, int b)
        {
            Console.WriteLine("바꾸기 전 a : {0}, b : {1}", a, b);
            int tmp;
            tmp = a;
            a = b;
            b = tmp;
            Console.WriteLine("바꾼 후 a : {0}, b : {1}", a, b);
        }
    }

기대되는 값은 a : 7, b : 5라는 값이지만 출력은 그렇지 않다.

Main의 변수의 값은 바뀌지 않았다.

swap함수가 호출되면서 a,b가 전달되는 것 같지만 사실은 a,b 원본이 아닌 '복사본'이 전달이 된다.

그래서 swap함수에서 아무리 값을 바꾼들 Main함수의 값은 바뀌지 않는다.

 

*해결법

1. swap함수에서 바뀐 값을 Main으로 return 시킴 

2. Call by reference 사용

 

2. Call by Reference

class Program
    {
        static void Main(string[] args)
        {
            int a = 5;
            int b = 7;
            swap(ref a, ref b);
            Console.WriteLine("In Main a : {0}, b : {1}", a, b);
        }

        static void swap(ref int a, ref int b)
        {
            Console.WriteLine("바꾸기 전 a : {0}, b : {1}", a, b);
            int tmp;
            tmp = a;
            a = b;
            b = tmp;
            Console.WriteLine("바꾼 후 a : {0}, b : {1}", a, b);
        }
    }

Call by reference는 인자를 전달할 때 값이 아닌 '주소'를 전달한다.

주소를 전달하기 때문에 Main변수의 값에 직접 접근하여 값을 변경할 수 있다.

 

해당 변수의 주소를 전달하기 위해서는 ref라는 키워드를 사용한다.

전달받은 함수의 매개변수또한 ref 타입이어야 한다.

값이 정상적으로 바뀌었다.

실제로 A와 B의 주소를 확인해보면,

Call by Value Call by Reference

Call by Value는 각각 다른 변수를 가리키고 있는 반면에 Call by Reference는 둘 다 같은 변수를 가리킨다.

 

Comments