1. 목표


메서드의 이해 및 사용


2. 정의


메서드(Method)란 C, C++ 언어에서는 함수(Function)불렸고 약간의 차이는 있겠지만 큰 틀에서 보면 같은 것을 지칭합니다. 

c#에서는 메서드로 불리고 한글표기로는 메서드가 맞지만 많은 사람들이 메소드라고 사용하기도 합니다.


메서드는 어떠한 동작을 하는 코드들을 하나의 이름으로 묶어 놓은것이고 이 이름을 호출하여 실행 할수 있습니다.

예) 우리가 앞서 배운 출력을 하기 위한 메서드는 Console.WriteLine();



3. 실습


선언 방식

class 클래스 이름
{
    [한정자] [반환 형식] [메서드 이름] ( [매개 변수] )
    {
         //실행 코드
         return [반환 형식 결과];
    }
}

한정자

여기서는 액세스 한정자(public, protected, private)에 대해서만 다루도록 하겠습니다.

액세스 한정자는 말 그대로 우리가 만드는 메서드를 호출할수 있는 권한을 정해 놓는 것입니다.

c#에서는 한정자가 없다면 자동으로 private로 지정됩니다.


public : 공개(누구나 접근하여 사용)

protected : 일부 공개(자신이 만들어진 class 또는 이를 상속 받는 하위 class에서만 사용)

private : 비공개(자신의 class에서만 사용)


반환 형식

void, int, string, class...등 이 메서드의 데이터 반환 형식을 지정할수 있습니다.

반환 형식은 선언된 반환 형식과 동일합니다.


void  : 아무것도 반환 할게 없는 경우 return문도 필요하지 않습니다.

int : 코드를 실행하고 마지막에 return뭉으로 int형식의 반환값을 보냅니다.



매개 변수

메서드의 마지막에 붙는 작은 괄호 ( ) 안에 실행 코드에서 사용 될 특정한 데이터를 받을수 있습니다.

매개 변수는 없을수도 여러개 일수도 있습니다.


static

static은 정적메소드로 프로그램이 처음 실행될때 메모리에 자동적으로 생성이 됩니다.

그래서 프로그램의 시작점(main(string[] args))인 main 메서드 또한 static으로 선언되어 있는데

이 정적메소드에서 사용하기위해 예제 및 강좌 에서는 static 한정자를 붙여 사용합니다.


소스 코드

using System;

namespace ConsoleApp1
{
    class Program
    {
        static int intPlus (int a, int b)
        {
            int result = a + b;
            return result;
        }
        static void Main(string[] args)
        {
            int nPlus = intPlus(10, 20);
            Console.WriteLine(nPlus);
        }
    }
}

결과

30 


위의 코드에서는 intPlus 메서드를 이용하여 int형 매개변수를 두개를 받아들이고 두 매개변수의 합을

리턴하는 메서드를 만들었습니다.

코드의 흐름을 알고 싶으시면 강좌 4편에서 언급한 디버그모드를 활용하여 확인하실수 있습니다.

14번 줄에 중단점을 놓고 F11을 이용해 다른 메서드로 이동하는 것까지 추적하여 볼수 있습니다.



오버로딩

우리가 Console.WriteLine의 메서드를 사용할때 int형이나 string과 같이 여러가지의 매개변수를

넣어 사용 하였는데 만능 메서드처럼 모든 매개변수를 받아들이는 것을 보았습니다.

이는 같은 이름의 메서드지만 매개변수로 받는 인자값을 달리하여 각각 메서드들이 만들어져 있고

실제로 사용할때 같은 메서드지만 매개변수의 형식에 따라 각각 대응을 하게 되는것을

메서드 오버로딩이라 합니다.



소스코드

using System;

namespace ConsoleApp1
{
    class Program
    {
        static int Plus (int a, int b)
        {
            int result = a + b;
            return result;
        }
        static float Plus(float a, float b)
        {
            float result = a + b;
            return result;
        }

        static void Main(string[] args)
        {
            int nPlus = Plus(10, 20);
            Console.WriteLine(nPlus);

            float fPlus = Plus(1.4f, 2.423f);
            Console.WriteLine(fPlus);

        }
    }
}

결과

30
3.823


위의 예제 처럼 같은 Plus 메서드 이지만 매개변수를 받는 인자값을 다르게 하여 int형과 float형에

대응 하도록 하였습니다.




매개 변수 전달 방식

매개 변수의 전달 방식은 크게 두가지로 나눌수 있는데 값에 의한 전달(call by value)과

참조에 의한 전달(call by reference)이 있습니다.


쉽게 말해 call by value는 메서드에서 값을 복사하여 전달 받아 사용은 할수 있지만 값의 변경은

하지못하고 call by reference는 해당 값이 있는 주소를 참조하여 전달 받아 값의 변경도 가능한

방법입니다.


소스코드(ref)

using System;

namespace ConsoleApp1
{
    class Program
    {
        //call by value
        static void Plus (int a)
        {
            a += 323;
        }
        //call by reference
        static void Plus(ref int a)
        {
            a += 814;
        }

        static void Main(string[] args)
        {
            int nA = 17;

            Plus(nA);
            Console.WriteLine("nA : {0}", nA);

            Plus(ref nA);
            Console.WriteLine("nA : {0}", nA);
        }
    }
}

결과

nA : 17
nA : 831


위의 예제코드에서 call by value는 8번줄의 메서드 처럼 인자 값 앞에 특정 키워드를 사용하지 않고 변수 형식과

변수이름을 넣어 사용하고 call by reference는 13번줄의 메서드처럼 인자 값 앞에 ref라는 키워드를 붙여 사용합니다.

이는 메서드를 호출하여 인자값을 전달 할때도 동일하게 ref 키워드를 짝으로 사용합니다.


call by reference의 키워드는 ref, out, in 세가지가 있습니다. 차이점은 앞서 사용한 ref는 매개 변수를 넘겨주고 받을때 먼저

초기화 해서 사용 하여야 되고 out은  초기화 하지 않아도 사용할수 있습니다. 이때 ref와 동일하게 out도 매개 변수를

넘겨주는 쪽과 받는쪽 둘다 out라는 키워드를 사용해야 합니다.

마지막으로 in은 ref와 out과 참조를 통해 인수를 전달하지만 값에 대한 수정은 불가능 합니다. 이는 매개변수의 안정성을

유지하면서 메서드를 사용할때 매개변수들의 복사본을 만들지 않아 잠재적으로 성능향상에 도움이 됩니다.

※이미 ref, out, in의 참조 형식의 메서드가 오버로드 되어 있는 경우 중복하여 오버로드 하여 사용할수 없습니다.


소스코드(out)

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Plus (out int a)
        {
            a = 777;
        }

        static void Main(string[] args)
        {
            int nA;

            Plus(out nA);
            Console.WriteLine("nA : {0}", nA);
        }
    }
}

결과

nA : 777


소스코드(in)

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Plus (in int a)
        {
            //아래와 같이 값에 대한 수정은 오류발생
            //Uncomment the following line to see error CS8331
            //a = 19;

            Console.WriteLine(a + 111);
        }
        static void Main(string[] args)
        {
            int nA = 777;

            Plus( nA);
        }
    }
}

결과

888 


※만약 c#버전에 의한 오류가 발생한다면 아래 이미지 참고





params

배열 형태의 매개변수를 사용지정 할수 있습니다.

일반적인 배열의 형태 뿐만 아니라 여러가지의 매개 변수들을 받을수 있습니다.


using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Plus (params object[] obj)
        {
            for (int i = 0; i < obj.Length; i++)
            {
                Console.Write("obj[{0}] : {1}", i, obj[i]);
                Console.WriteLine();
            }
        }
        static void Main(string[] args)
        {
            object[] objArray = { 777, 888, 'k', "test"};

            Plus(objArray);
        }
    }
}

결과

obj[0] : 777
obj[1] : 888
obj[2] : k
obj[3] : test


다음 강좌에서는 클래스에 대해 알아보도록 하겠습니다.


+ Recent posts