C# Method(3)

#1. 출력 전용 매개 변수


출력 전용 매개변수는 ref와 비슷한 성질을 지니고 있다. ref와 마찬가지로 참조에 의한 값의 전달이 가능하다.

출력 전용 매개 변수를 사용하기 위해서는 ref대신 out라는 키워드를 사용한다. 그렇다면 ref와의 다른점은 무엇인가?

ref의 경우는 메소드가 해당 매개 변수의 결과를 저장하지 않아도 컴파일러는 아무런 경고를 하지 않는다.

그러나 out의 경우는 메소드가 해당 매개 변수에 결과를 저장 하지않으면 컴파일러가 에러 메시지를 출력한다. 일종의 안전장치 같은 셈이다.

호출된 메소드에서는 입력된 out매개 변수를 쓰기만 할 수 있다. 이름 그대로 '출력 전용'이기 때문이다.

호출된 메소드 안에서는 초기화를 하지않으면 out키워드를 사용할때 컴파일러에서 에러 메시지를 출력한다고 했다. 호출하는 쪽의 메소드에서도 그럴까?

호출하는 쪽의 메소드(여기서는 Main()메소드)에서는 초기화를 하지 않아도 out키워드를 사용해서 호출한 메소드의 out매개 변수로 넘기는 것이 가능하다.

아래에서 간단한 예제를 통해 out키워드의 사용법에 대해서 알아보자
  class Program
    {
   
   
        static void Divide(int a, int b, out int quotient, out int remainder)
        {
            quotient = a / b;
            remainder = a % b;

        }

        static void Main(string[] args)
        {
            int a = 20;
            int b = 3;
            int c;
            int d;
            int ab;
            int ac;
            Divide(a, b, out c, out d);
            Console.WriteLine("a: {0}, b: {1}, a/b : {2}, a%b: {3}", a, b, c, d);
        }
    }

#2. 메소드 오버로딩


메소드 오버로딩(Method Overloading)은 c,c++에서는 함수 오버로딩(Function Overloading)이라고 불리는 것과 같다.

아래의 예제를 보면서 정리하겠다.

class Program
    {
        static int plus(int a, int b)
        {
            return a + b;
        }
        static float plus(float a, float b)
        {
            return a + b;
        }
        static void Main(string[] args)
        {
            int num1 = 10;
            int num2 = 20;

            float fnum1 = 1.1f;
            float fnum2 = 1.2f;

            Console.WriteLine(plus(num1, num2));
            Console.WriteLine(plus(fnum1,fnum2));
        }
    }

이렇듯 메소드의 이름은 같지만 매개변수가 다르면 같은 이름이라도 여러개의 메소드를 만들 수 있다. 여기서 반환형은 묻지도 않는다. 이 같은 방식을 메소드 오버로딩 이라고 부른다. c,c++에서도 별반 다를 바가 없다.


#3. 가변길이 매개변수


C#에서는 가변길이 매개 변수라는 것을 지원한다. 이것이 과연 무엇인가 알아보자.

'가변'이라는 말에서 눈치 챘겠지만 길이를 자유자재로 늘리고 줄일 수 있는 것을 의미한다.

즉 가변길이 매개 변수란, 매개 변수의 수를 가변적으로 만들어서 매개 변수의 수를 유연하게 변할 수 있는 매개 변수를 말한다.

메소드 오버로딩의 경우는 매개 변수의 형식이 다른 경우에 사용할 수 있지만. 가변길이 매개 변수의 경우는 형식은 같지만 매개 변수의 개수만 유연하게 달라질 수 있는 경우에 사용하는 것이 적합하다.

가변길이 매개 변수는 params 키워드와 배열을 이용해서 만들 수 있다. 아래 예제를 참고해 보자.

 class Program
    {
        static int Sum(params int[] args)
        {
            Console.Write("Summing...");

            int sum = 0;

            for (int i = 0; i < args.Length; i++)
            {
                if (i > 0)
                    Console.Write(",");

                Console.WriteLine(args[i]);

                sum += args[i];
            }
            Console.WriteLine();

            return sum;

        }
        static void Main(string[] args)
        {
            int sum = Sum(3, 4, 5, 6, 7, 8, 9, 10);

            Console.WriteLine("SUM: {0}", sum);
        }
    }


params키워드를 쓰면 Sum()메소드에 입력한 모든 매개 변수는  args 배열에 담겨지게 된다. 
그리고 코드를 보다가 특이한 것이 하나 보인다.

args.Length라는 것인데, 이것은 매개 변수의 갯수(길이)를 반환해주는 기능을 하고 있다.

#4.명명된 매개 변수


대부분의 메소드는 순서에 따라서 매개 변수에 값을 할당하지만 C#에서는 또 다른 스타일을 지원한다. 명명된 매개 변수(Named Parameter)를 알아보자.


  class Program
    {
        static int Sum(int a, int b)
        {
            return a + b;
        }
        static void Main(string[] args)
        {
            Console.WriteLine(Sum(a: 1, b: 2));
        }


#5. 선택적 매개 변수


메소드의 매개 변수는 기본값을 가질 수 있다.

static int Sum(int a= 10, int b = 20)
{

          return a + b;
}

메소드의 매개 변수에 할당 연산자(=)을 붙여서 값을 할당할 수 있다. 이럴 경우 메소드를 호출할 때 따로 값을 전달하지 않게 되면 미리 지정되어 있는 기본값을 매개 변수의 값으로 사용하게 된다.

물론 메소드를 호출할 때 값을 전달하게 되면 기본값은 무시되고 전달한 값으로 재할당 된다.

이같이 기본값을 가지는 매개 변수를 디폴트 매개변수(Default Parameter)라고 하며, 필요에 따라 데이터를 할당하거나 할당하지 않을 수 있기 때문에 선택젹 매개변수(Optional Parameter)라고도 부른다.

사용시 주의할 점은 디폴트 매개변수를 전부 쓰는 것이 아니라 일부만 사용할 때에는 매개 변수의 오른쪽부터 채워나가야 한다. 메소드의 경우 호출할때에는 왼쪽부터 오른쪽으로  값이 전달되는데, 위에 Sum()메소드에서 a의 디폴트 매개변수를 10이라고 했으며 이 디폴트 매개 변수를 사용하고자 할경우

Console.WriteLine( Sum( , 3));

호출되지 않는다.... 언급한대로 오른쪽부터 채워나가자.

참고 자료 ㅡ
뇌를 자극하는 C#4.0 프로그래밍

http://msdn,microsoft.com/ko-kr/library/


Post a Comment

다음 이전