키워드 ref -------------------------------------------------------------------------------------------------------------------------------------


C++에서는 함수인자로 들어간 파라미터들의 원본의 값까지 변경하고 싶을때 포인터나 레퍼런스를 사용한다.

하지만 C#에서는 ref라는 키워드를 통해서 함수의 인자를 참조하겠다는 것을 명시해줘야 한다.


class RefExample

{

    static void Method(ref int i)

    {

        i = 10;

    }

    static void Main()

    {

        int val = 0; -> ref는 항상 먼저 초기화 해줘야 한다.

        Method(ref val); -> 할때도 붙여줘야 한다. 이제 int val은 값이 변경되어서 다음 구문으로 이동한다.

        // val is now 10 -> val의 값은 이제 44가 되어있다. 일반적으로 val의 값은 변경되지 않는다. 

하지만 참조가 출동한다면? 인자로 집어넣은 값을 변경시킬 수 있다.

    }

}


사용법은 함수 인자 앞에 ref만 붙여주면 끝! 참 쉽다!


키워드 params---------------------------------------------------------------------------------------------------------------------------------


namespace ConsoleApplication1
{
    class Program
    {
        public static void UseParams(params int[] list) -> 같은 배열의 인자를 여러 리스트 형으로 넣는다.
        {
            for (int i = 0; i < list.Length; i++)
            {
                Console.Write(list[i] + " ");
            }
            Console.WriteLine();
        }

        public static void UseParams2(params object[] list) -> 오브젝트 형이라 딱히 인자값의 제한이 없다.
        {
            for (int i = 0; i < list.Length; i++)
            {
                Console.Write(list[i] + " ");
            }
            Console.WriteLine();
        }

        static void Main(string[] args)
        {

            int[] array = new int[8];

            for (int i = 0; i < 8; ++i)
                array[i] = i;

            UseParams(1, 2, 3); -> 상수도 넣고 인자수도 제한이 없다. 

            UseParams(array[0], array[1], array[2], array[3], array[4], array[5], array[6], array[7]); -> 이렇게 넣을수도 있고,

            Array.Clear(array, 0, array.Length); -> 배열 클래스를 통해서 다음과 같이 초기화가 가능하다.

            UseParams(array); -> 배열을 넣어준다.

            UseParams2(1, 'a', "test"); -> 오브젝트이기 때문에 다양한 형을 넣을 수 있다. 
        }
    }
}

키워드 out---------------------------------------------------------------------------------------------------------------------------------


out 키워드는 인수를 참조로 전달하는 데 사용됩니다. 이는 ref 키워드와 비슷하지만 ref의 경우 변수를 전달하기 전에 초기화해야 한다는 점에서 차이가 있습니다. out 매개 변수를 사용하려면 메서드 정의와 호출하는 메서드에서 모두 out 키워드를 명시적으로 사용해야 합니다. 예를 들면 다음과 같습니다.
C#
class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}


out 인수로 전달되는 변수는 이를 전달하기 전에 초기화할 필요가 없지만 호출하는 메서드는 메서드 반환 이전에 값을 할당해야 합니다.
ref 및 out 키워드는 런타임에 서로 다르게 취급되지만 컴파일 타임에는 동일하게 취급됩니다. 따라서 한 메서드는 ref 인수를 사용하고 다른 메서드는 out 인수를 사용하는 경우 메서드를 오버로드할 수 없습니다. 예를 들어 이러한 두 메서드는 컴파일할 때 동일하게 간주되므로 다음과 같은 코드는 컴파일되지 않습니다.
C#
class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}


그러나 한 메서드가 ref 또는 out 인수를 사용하고 다른 메서드는 두 인수 중 어느 것도 사용하지 않는 경우 다음과 같이 오버로드할 수 있습니다.
C#
class OutOverloadExample
{
    public void SampleMethod(int i) { }
    public void SampleMethod(out int i) { i = 5; }
}


속성은 변수가 아니므로 out 매개 변수로 전달할 수 없습니다.


확장메서드 ------------------------------------------------------------------------------------------------------------------------------------


using Extension;

namespace Extension

{

    public static class ExtensionMethod

    {

        public static int Multiplication(this int var, int a, int b)

        {

            int result = var;


            for (int i = 0; i < b; i++)

                result *= a;


            return result;

        }

    }

}


namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("{0}", 6.Multiplication(2, 3)); -> 객체화 하지 않고도 함수를 불러올 수 있다.

        }

    }

}


c++의 static함수를 기억하는가 그것을 기억한다면 알기 쉬울 것이다.

즉 객체를 생성하지 않고도 다음과 같은 출력이 가능하게 하는 것이다. 각 숫자가 어떻게 대입되는지 알겠는가?


using Extension; -> 확장메서드를 사용하기 위해서는 다음과 같이 네임스페이스 지정이 필요하다.


namespace Extension

{

    public static class ExtensionMethod -> 확장메서드를 포함하는 클래스도 static 클래스 이여야 한다.

    {

        public static int Multiplication(this int var, int a, int b) -> this를 붙여주어야 한다. this는 확장매서드 호출에 사용되는 상수나 변수의 값을 받아들인다.

        {

            int result = var;


            for (int i = 0; i < b; i++)

                result *= a;


            return result;

        }

    }

}


namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("{0}", 6.Multiplication(2, 3)); -> 호출하는 부분을 보자. 6? 뭐지? 라고 생각하겠지만 this에 어떤 인자가 들어갈지 생각해보면 편하다.

        }

    }

}


그리고 실험


namespace Extension

{

    public static class ExtensionMethod

    {

        public static int Multiplication(this int var, int a, int b)

        {

            int result = var;


            for (int i = 0; i < b; i++)

                result *= a;


            return result;

        }

    }

}


namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            int a = 6;

            int b = 7;

            b = a.Multiplication(2, 3); -> 역시 변수를 통해서도 호출이 가능했다.

            Console.WriteLine("{0}", b);

        }

    }

}

'게임개발공부 > C#공부' 카테고리의 다른 글

속성(property)  (0) 2013.12.27
override 문법의 직관화  (0) 2013.12.20
클래스의 새로운 개념 <partial >  (0) 2013.12.19
foreach  (0) 2013.12.19
배열과 배열메소드  (0) 2013.12.19
Posted by JJOREG