공부/C#

[C#] Call by reference (참조에 의한 매개변수 전달)

코멍이 2023. 8. 8. 16:15

 

메소드를 호출할때 필요한 값은 매개변수를 이용하여 전달할 수 있다.

 

메소드란?

객체지향 프로그래밍 언어에서 사용하는 용어로 일련의 코드를 하나의 이름으로 묶은 것이다. 

 


class 클래스 이름{
        한정자 반환형식 메소드이름(매개변수목록){
                //실행하고자 하는 코드

                return 메소드결과
        }


+) 메소드 결과의 데이터 형식은 반환 형식과 항상 동일해야한다. 예를 들어 반환 형식을 int로 지정하였다면 해당 메소드의 결과값은 항상 정수형 데이터여야 한다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Csharp_Project
{
    class Caculator
    {
        //매개변수를 포함한 메소드
        public static int Plus(int a,int b)
        {
            int result = a + b;
            return result;
        }
    }

    class Method
    {
        public static void Main()
        {
            int x = 10;
            int y = 20;

            Console.WriteLine(x + "+" + y + "="+Caculator.Plus(x,y));
        }
    }
}

 

<실행결과>

 

 

여기서 한 가지 주목해야할 부분이 있다. Caculator.Plus(x,y)를 통해 x와 y는 매개변수로써 a와 b에 넘겨졌다.

그렇다면 x와a, y와b는 같은 공간을 공유하고 있는 것일까?

 

 

다른 예제를 하나 살펴보자.

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Csharp_Project
{
    class Method_Swap
    {
        public static void Swap(int a, int b)
        {
            int temp = b;
            b = a;
            a = temp;
        }

        static void Main(string[] args)
        {
            int x = 1;
            int y = 2;

            Console.WriteLine("x=" + x + ",y=" + y);

            Swap(x, y);

            Console.WriteLine("x=" + x + ",y=" + y);

        }
    }
}

 

두 매개변수의 값을 교환하는 유명한 Swap 메소드이다. 

 

위 코드를 이미지로 나타낸 자료

 

그렇다면 실행 결과는 어떨까?

 

 

 

Swap메소드를 사용하였음에도 x와 y의 값이 바뀌지 않았다. 

x와a, y와b는 완전히 별개의 공간이기 때문이다.

 

언뜻 보면 매개변수를 통해 x의 값이 Swap메소드의 a로, y의 값이 Swap메소드의 b로 이동한 것 같지만 사실은 그렇지 않다는 것이다. 두 변수들은(x와a, y와b) 서로의 공간을 공유하는 것이 아닌 값을 복사하여 할당하였을 뿐이다.

 

 

 

a와 b는 x와 y의 값을 복사하여 할당받았을 뿐인 완전히 다른 공간이다.

때문에 a와 b의 값에 무슨 짓을 하든 x와 y에는 아무런 변화도 생기지 않는다.

 

그렇다면 두 공간을 공유할 수는 없는 것일까?

 

이럴때 필요한 것이 바로 참조에 의한 전달이다.

 

앞선 방법은 값에 의한 전달 방법으로 매개변수가 변수나 상수로 부터 값을 복사한다.

반면 참조에 의한 전달은 매개변수가 메소드에 넘겨진 원본 변수를 직접 참조한다.

한마디로 매개변수와 원본 변수가 같은 공간을 공유한다는 것이다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Csharp_Project
{
    class Method_Swap
    {
        public static void Swap(ref int a, ref int b)
        {
            int temp = b;
            b = a;
            a = temp;
        }

        static void Main(string[] args)
        {
            int x = 1;
            int y = 2;

            Console.WriteLine("x=" + x + ",y=" + y);

            Swap(ref x, ref y);

            Console.WriteLine("x=" + x + ",y=" + y);

        }
    }
}

 

참조에 의한 전달을 사용하기 위해선 매개변수 앞에 ref 키워드를 붙여주면 된다.

(호출할 때 역시 마찬가지!)

 

 

<실행결과>

 

 

 

x와 y의 값이 무사히 바뀌었다.