본문 바로가기

프로그래밍/C#

[C#] ref, out 을 통한 Call by Reference 구현해보기

 



 

 

 

 

 

C# Prog.


 

 

처음으로 C#을 공부하면서 포스팅한 것이기에 다소 틀린 내용이 있을 수 있습니다. 그리고, 다른 언어를 알고 계시다는 가정하에 포스팅 하기때문에, 프로그래밍 언어를 처음 공부하시는 분은 다른 글도 참고하시길 바랍니다. 이 글은 <뇌를 자극하는 C# 4.0 프로그래밍>을 참고하였습니다.

 


 C#에서는 참조에 의한 호출(전달)을 위한 두가지 키워드를 제공하는데요. 'ref'와 'out' 바로 이들입니다.

 

 우선 'ref'는 기존의 C의 포인터와 유사하게 메모리내에 저장되어 있는 값을 가리킵니다.

하지만, 포인터라고는 할 수 없을 것같습니다. 알아보니 'unsafe'라는 포인터를 사용하기 위한 키워드가 따로 존재하더군요. 그래서 제 생각으로는 단순히 참조를 하기위한 키워드로 사료됩니다.

 

 'out' 매개변수는 '출력 전용 매개 변수'라 해서, out 키워드를 적용한 변수는 읽어드릴 수 없습니다. 대신 값을 내보내는 '쓰기'만 가능한 키워드인거죠.

 

 일단, 적절히 생각나는 예제가 없어서, 이부분에 대해서는 책을 잠시 참고할게요.

 

 우선, 변수의 값을 서로 바꿔주는 swap 이라는 함수를 구현해볼까 하는데요. 포인터를 배울 때, 많이 만들어보는 함수죠?

 

 

namespace TEST
{
    class Test
    {
        static void Main(string[] args)
        {
            int a = 100;
            int b = 200;

            swapValues(a, b);

            Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "a", a);
            Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "b", b);
        }

        public static void swapValues(int a, int b)
        {
            int temp = a;
            a = b;
            b = temp;           
        }
    }
}

 

결과 입니다.

 

 

 

 
결국 원하는 결과 값이 아니네요. 하지만, ref와 out을 사용해서 다시 구성해보겠습니다.

 

우선 ref 입니다.

namespace TEST
{
    class Test
    {
        static void Main(string[] args)
        {
            int a = 100;
            int b = 200;

            swapValues(ref a, ref b);

            Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "a", a);
            Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "b", b);
        }

        public static void swapValues(ref int a, ref int b)
        {
            int temp = a;
            a = b;
            b = temp;           
        }
    }


결과는요?

 

 

자, 값이 바뀐것이 확인되었죠? 그렇다면 이어서 out을 활용한 swap함수를 구현해보겠습니다.

하지만 out 키워드를 쓰기 전에 알아두어야 할 사항이 두가지 있습니다.

1. out 키워드가 쓰인 변수는 함수가 끝나기 전에 값을 저장해야 합니다.

그렇지 않으면, 다음과 같은 오류를 만나게 됩니다.

 

 

메시지 내용은 '현재 메소드를 떠나기전에 해당 변수가 할당되어야 한다' 즉, 값이 꼭 저장되어야 함을 의미합니다.

 

2. out 키워드가 쓰인 변수는 함수내에서 값을 읽을 수 없습니다.  '쓰기'전용입니다.

그렇지 않으면, 다음과 같은 오류를 만나게 됩니다.

 

 

메시지 내용은 '에러 : 할당되지 않은 매개변수의 사용'이라고 뜨네요. out 키워드는 매개변수로 넘어오는 매개변수의 주소만 참조할 뿐, 실제로 값은 신경도 쓰지 않는 것(?)을 알 수 있네요.

 


 

실제로, 예만 보여드리기 위해서, out 키워드를 쓴 swap 함수를 구현할 건데요. 만들어 놓고도 참.. ㅋㅋ

단지 설명용으로 보세요 ㅎㅎ

namespace TEST
{
    class Test
    {
        static void Main(string[] args)
        {
            int a = 100;
            int b = 200;
            int swappedA = 100;
            int swappedB = 200;


            swapValues(a, b, out swappedA, out swappedB);

            Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "a", swappedA);
            Console.WriteLine("변수 {0}에 들어있는 수는 {1}입니다.", "b", swappedB);
        }

        public static void swapValues(int a, int b, out int swappedA, out int swappedB)
        {
            swappedA = b;
            swappedB = a;
        }
    }
}

 


결과는요?

 

 

 ref와 out 모두 호출할때, 키워드를 생략하면 안된다는 점 숙지하시구요~ 여기까지 입니다.~