C#

C# 2

ryancha9 2019. 12. 2. 00:09

* 메소드는 프로시저 = 메소드 = 함수 라고 불린다.

 

 

* static 이란?

c와 c++에서는 정적변수로 함수를 나가도 함수 내에 있는 변수 값을 유지하는 용도로 쓰였지만

클래스에서는 좀 다르다.

 

--------------------------------------------------------

 

    class Program

    {

 

        public static void abc (int p)

        {

            Console.Write(p);

        }

 

 

        static void Main(string[] args)

        {

 

            int a = 10;

            abc(a); 

           ...

 

--------------------------------------------------------

 

    class Program

    {

 

        public void abc (int p)

        {

            Console.Write(p);

        }

 

 

        static void Main(string[] args)

        {

 

            int a = 10;

            Program b = new Program();

            b.abc(a);

 

--------------------------------------------------------

 

* static으로 선언된 경우

- 동일한 클래스 내부의 메소드에 접근할 때 abc()란 함수명만 있으면 접근이 가능하다.

 

* static으로 선언되지 않은 경우

- 동일한 클래스 내부의 메소드에 접근할 때 클래스의 인스턴스를 선언해주고 접근해야 한다.

 

// 외부의 클래스에 접근할 때도 마찬가지다.

 

 

--------------------------------------------------------

 

    class Program2

    {

        public static void abc2(int p)

        {

            Console.Write(p);

        }

    }

 

    class Program

    {

 

        public void abc (int p)

        {

            Console.Write(p);

        }

 

 

        static void Main(string[] args)

        {

            int a = 10;

            Program2.abc2(a);

 

--------------------------------------------------------

 

    class Program2

    {

        public void abc2(int p)

        {

            Console.Write(p);

        }

    }

 

    class Program

    {

 

        public void abc (int p)

        {

            Console.Write(p);

        }

 

 

        static void Main(string[] args)

        {

            int a = 10;

 

            Program2 bbc = new Program2();

 

            bbc.abc2(a);

 

--------------------------------------------------------

 

* static으로 선언된 경우

- 다른 클래스의 메소드에 접근할 때 클래스명.abc()란 함수명만 있으면 접근이 가능하다.

 

* static으로 선언되지 않은 경우

- 다른 클래스의 메소드에 접근할 때 클래스의 인스턴스를 선언해주고 접근해야 한다.

 

 

* ref, out 함수

- 값에 의한 전달과 참조에 의한 전달을 알고 있다면 간단하다.

- ref를 메서드에서 사용할 때 주의할 점은 보낼 곳과 받을 곳에 써준다.

- ref는 초기화시 사용 (x), 보낼 때 (o), 받을 때 (o)

 

--------------------------------------------------------

 

        public static void abc(ref int a, ref int b)  // 받을 때 사용o

        {

            int temp = a;

            a = b;

            b = temp;

        }

 

        static void Main(string[] args)

        {

 

            int a = 10;  // 초기화시 사용x

            int b = 20;

 

            abc(ref a, ref b);  // 보낼 때 사용o

 

            Console.Write("{0} {1}", a, b);

        }

 

--------------------------------------------------------

 

// 두 개의 값이 바뀐 것을 확인할 수 있다.

 

 

- out 함수는 출력함수로 용도가 조금 다르다.

- out은 초기화 사용 (x), 보낼 때 (o), 받을 때 (o)

 

--------------------------------------------------------

 

       public static void abc(int a, int b, out int c)

        {

            c = a + b;

        }

 

        static void Main(string[] args)

        {

 

            int a = 10;

            int b = 20;

            int c;

 

            abc(a, b, out c);

 

            Console.Write("{0} {1} {2}", a, b, c);

        }

 

--------------------------------------------------------

 

// out은 메서드 내에서 값이 입력되지 않으면 에러가 난다.

// 반드시 메서드를 거쳐 값이 입력될 때만 사용한다. 사용할 일은 별로 없어보인다.

 

 

* 메소드 오버로딩

 

static int abc(int a, int b)

static int abc(int a, int b, int c)

static double abc(double a, double b)

static double abc(double a, int b)

 

// 그렇다면 리턴형만 다르고 매개변수가 같다면? 안된다.

 

int abc(int a, int b)

double abc(int a, int b) 이건 불가능.

 

 

* params 가변길이 매개변수

 

- 메서드에 params + 배열로 받으면 무제한의 매개변수를 받을 수 있다.

 

--------------------------------------------------------

 

        public static void abc(params int [] a)

        {

 

            foreach(int i in a)

            {

                Console.Write(i);

            }

           

        }

 

        static void Main(string[] args)

        {

            abc(1, 2, 3, 4, 5, 6, 7);     

        }

 

--------------------------------------------------------

 

// 차라리 배열을 넘기는게 깔끔하지 않을까.. 굳이 쓸 필요는 없어보인다.

 

 

* named 명명된 매개변수

 

- 매개변수의 이름으로 값을 지정해서 넘기는 방식이다.

 

--------------------------------------------------------

 

        public static void abc(int a, int b)

        {

            Console.Write(a);

            Console.Write(b);

        }

 

        static void Main(string[] args)

        {

            abc(a: 10, b: 20);  // int c = 50; abc(a:c)도 가능

        }

 

--------------------------------------------------------

 

// 별 쓸모는 없어보이지만 매개변수가 많거나 할 땐 필요할 수도 있을 것 같다. 

 

 

* optional 선택된 매개변수

 

- 매개변수의 고정 값을 넣는 방식이다. 유동적이라 쓸모있음.

 

--------------------------------------------------------

 

        public static void abc(int a, int b, int c = 30)

        {

            Console.WriteLine("{0} {1} {2}", a, b, c);

        }

 

        static void Main(string[] args)

        {

            abc(10, 20);

            abc(10, 20, 50);

        }

 

--------------------------------------------------------

 

// 매개변수 자체에 고정값을 넣는건데 2개가 넘어올땐 고정값이 들어가지만

3개가 넘어올 땐 넘어온 값으로 바뀐다.