C#문법

[C#문법] Part9-2 함수: 함수호출방법(Call By Value, Call By Reference, Call By Result)

BlackWolfDev 2023. 3. 15. 20:15

[ 개요 ]

함수를 호출하는 방법에도 여러 가지가 존재한다.

어떤 방법으로 함수를 호출했느냐에 따라 전혀 다른 결과 값이 반환되므로 각각의 차이점을 알아야한다.


[ 값에 의한 호출 ]

값에 의한 호출이란 함수를 호출할 때 필요한 매개변수의 값을 넘겨주는 방식이다.

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("CallByValue 출력: " + CallByValue(1));
    }

    static int CallByValue(int a)
    {
        return a;
    }
}

콘솔결과값

CallByValue() 함수에 값을 넘기고 출력이 됨을 확인할 수 있다.


[ 참조에 의한 호출 ]

참조에 의한 호출은 함수에 전달되는 인수를 저장하고 있는 메모리에서 직접 데이터를 가져오는 방식이다.

값에 의한 호출에 비해 함수 연산의 정확성이 보장된다.

이 호출 방법을 사용하려면 함수를 정의할 때와 호출할 때 모두의 변수의 이름 앞에 키워드 ‘ref’를 붙여줘야 한다.

class Program
{
    static void Main(string[] args)
    {
        int num1 = 1;
        int num2 = 2;
        CallByValue(num1, num2);
        Console.WriteLine("CallByValue 출력: " + num1);
        CallByReference(ref num1, ref num2);
        Console.WriteLine("CallByRenference 출력: " + num1);
    }

    static void CallByValue(int num1, int num2)
    {
        int temp = num1;
        num1 = num2;
        num2 = temp;
    }
    static void CallByReference(ref int num1, ref int num2)
    {
        int temp = num1;
        num1 = num2;
        num2 = temp;
    }
}

콘솔결과값

위의 코드는 숫자를 서로 바꾸는 프로그램이다.

값에 의한 함수 호출에서 값을 swap 했지만 함수를 빠져나오고 실행시켜보니 값이 바뀌지 않았다.

반면에, 참조에 의한 함수 호출에서 ref를 붙여서 swap을 하니까 함수를 빠져나와도 값이 바뀌어있음을 확인할 수 있다.

이는 메모리에 접근하여 값을 바꾸었기에 가능하다.


[ 결과에 의한 호출 ]

결과에 의한 호출은 함수에게 인수를 넘겨주는 것이 아닌 함수로부터 값을 가져오는 것이다.

참조에 의한 호출이 ‘ref’를 붙였다면 결과에 의한 호출은 ‘out’를 붙인다.

class Program
{
    static void Main(string[] args)
    {
        int num1 = 1;
        CallByResult(out num1);
        Console.WriteLine("CallByResult 출력: " + num1);
    }

    static void CallByResult(out int num1)
    {
        num1 = 0;
    }
}

콘솔결과값 출력

위와 같이 함수 내에서 값을 변경하여 내보내는 것이라면 결과에 의한 호출을 사용하면 된다.

 

참고로 아래와 같이 바꾸고자 하는 변수의 값을 미리 지정하지 않아도 오류 없이 결과를 출력할 수 있다.

(, 변수와 결과에 의한 호출에서의 값을 둘 다 지정하지 않는다면 오류가 발생한다.)

class Program
{
    static void Main(string[] args)
    {
        int num1;
        CallByResult(out num1);
        Console.WriteLine("CallByResult 출력: " + num1);
    }

    static void CallByResult(out int num1)
    {
        num1 = 3;
    }
}

콘솔결과값

 

728x90
반응형