728x90
반응형

매개변수(Parameter)

 

  • 값에 의한 전달(Pass by value)

값에 의한 전달(Pass by vlaue)란 메소드를 호출할 때, 데이터를 복사해서 매개변수에 넘기는 것을 말한다.

예를들어 Sum.Plus() 메소드에 매개변수로 넘겨진 a와 b는 실제로 메서드 내부로 들어가는 것이 아니다.

매개변수는 메소드의 외부에서 메소드 내부로 데이터를 전달하는 매개체 역할을 할뿐이다.

한 변수를 또 다른 변수에 할당하면 변수가 담고 있는 데이터만 복사될 뿐이다.

class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            int b = 20;
            
            Console.WriteLine("[(before)Swap메소드] a : {0}, b : {1}", a, b);
            Cal.Swap(a, b);
            Console.WriteLine("[(after)Swap메소드] a : {0}, b : {1}", a, b);
        }
    }

    class Cal
    {
        public static void Swap(int num1, int num2)
        {
            //when num1 = 10, num2 = 20
            int temp = num2;  // temp =20
            num2 = num1; // num2 =10
            num1 = temp; // num1 = 20
            Console.WriteLine("[Swap메소드] temp : {0}, num2 : {1}, num1 : {2}", temp, num2, num1);

        }
    }

 

 

  • 참조에 의한 전달(Pass by reference)

참조에 의한 전달은 매개변수가 메소드에 넘겨진 원본 변수를 직접 참조하는 것을 말한다.

참조에 의한 전달을 사용하면 메소드 안에서 매개변수를 수정하면 이 매개변수가 참조하고 있는 원본 변수에 수정이 이루어진다. 문법은 메소드를 선언하는 매개변수와 호출하는 매개변수 앞에 ref 키워드를 붙여주면 된다.

    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            int b = 20;
            
            Console.WriteLine("[(before)Swap메소드] a : {0}, b : {1}", a, b);
            Cal.Swap(ref a, ref b);
            Console.WriteLine("[(after)Swap메소드] a : {0}, b : {1}", a, b);
        }
    }

    class Cal
    {
        public static void Swap(ref int num1, ref int num2)
        {
            //when num1 = 10, num2 = 20
            int temp = num2;  // temp =20
            num2 = num1; // num2 =10
            num1 = temp; // num1 = 20
            Console.WriteLine("[Swap메소드] temp : {0}, num2 : {1}, num1 : {2}", temp, num2, num1);

        }
    }

 

 

  • 출력 전용 매개변수(Out 키워드)

out 키워드는 참조에 의한 전달을 할 수 있는 또 하나의 키워드이다.

보통 메소드의 결과값은 하나만 반환하지만 두 개 이상의 결과값을 원할 때가 있다. 이런 경우 out 키워드를 이용하면 여러 개의 결과값을 얻을 수 있다. 문법은 메소드의 선언부와 호출부에 out 키워드를 사용하면 된다. 출력 전용 매개변수는 메서드를 호출하기 전에 미리 선언할 필요가 없다. 호출할 때 매개변수 목록안에서 즉성으로 선언하며 된다.

    class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            int b = 2;

            Cal.Divide(a, b, out int r1, out int r2);
            Console.WriteLine("[(after)Swap메소드] a : {0}, b : {1}", a, b);
        }
    }

    class Cal
    {
        public static void Divide(int num1, int num2, out int quotient, out int remainder)
        {
            quotient = num1 / num2;
            remainder = num1 % num2;

            Console.WriteLine("quotient = num1/num2 =  {0}, remainder : num1%num2 = {1}", quotient, remainder);

        }
    }

 

ref 키워드

ref 키워드를 이용해서 매개변수를 넘기는 경우에는 메소드가 해당 매개변수에 결과를 저장하지 않아도 컴파일러는 아무런 경고도 하지 않는다. 

 

out 키워드

Out 키워드를 이용해서 매개변수를 넘기는 경우에는 메소드가 해당 매개변수에 결과를 저장하지 않으면 컴파일러가 에러 메세지를 출력한다.

 

 

가변길이 매개변수(params 키워드)

가변길이 매개변수란 개수가 유연하게 변할 수 있는 매개변수를 말한다.

매개변수가 유한하게 정해져 있다면 가변길이 매개변수 보다는 메소드 오버로딩을 사용하는 것이 좋다.

가변길이 매개변수는 자료형은 같으나 매개변수의 개수가 유연하게 달라질 수 있는 경우에 적합하다.

 

가변길이 매개변수 사용 예시

가변길이 매개변수의 사용 방법은 params 키워드배열을 이용해서 선언한다.

class Cal
{
    public static int Sum(params int[] number)
    {
        int sum = 0;

        for (int i = 0; i < number.Length; i++)
        {
            sum += number[i];
        }

        return sum;
    }
}

 

로컬함수(Local Function)

로컬함수는 메소드 안에서 선언되고 선언된 메소드 안에서만 사용되는 특별한 함수다.

클래스의 멤버가 아니기 때문에 메소드가 아니라 함수라고 부른다. 그리고 메소드 밖에서 다시 사용할 일 없는 반복적인 작업을 하나의 이름으로 묶어 놓을 때 적합하다.

728x90
반응형

+ Recent posts