메서드?
C# 에서 메서드란 C 또는 C++에서 함수(Function)의 역할을 하는 것.

메서드의 기본형태는

static void 메서드이름(매개변수) //매개변수의 또다른 이름은 파라미터
{
    코드
}

입니다.

 

이러한 기본형태는 사실 우리가 흔히 쓰고있었 습니다.

바로 코드를 작성할 때 우리가 가장 기본적으로 사용하고 있는 main에서 인데요

static void Main(string[] args)
//				└매개변수
{
    
}

메인 메서드는 컴퓨터가 프로그램을 실행하면 가장 먼저 찾아서 실행해주는 영역입니다.

그래서 메서드를 선언할 때 이 메인 메서드 영역 밖에서 메서드를 작성하고

그 메서드를 메인에 불러오는 형식으로 작성해주면 되는데요.

예를 들면

//예시 1
namespace ConsoleApp1
{
    class Program
    {
        static void plus(int a, int b)
        {
            Console.WriteLine(a+b);
        }
        static void Main(string[] args)
        {
            int a = 10;
            int b = 20;

            plus(a, b);
        }
    }
}

의 형식인 것입니다. 코드를 보면 class 영역 내부 main영역 외부에 작성된 메서드를 보실 수 있는데요.

  1. 프로그램 시작
  2. main메서드 실행
  3. 변수 a , b 선언
  4. plus 메서드에 변수 a,b를 매개변수로 넣고 호출
  5. plus메서드 영역으로 이동
  6. 출력문 출력
  7. plus메서드 종료
  8. 메인 메서드 종료

이러한 순서로 진행되고 있는 것입니다.


메서드를 배우면서 저는 궁금증이 들었는데요 static? void? 이것은 무엇인가? 하는 것이었습니다.

이중 static 의 경우는

이중 void는 '리턴 타입'인데요

이는 메소드를 실행하고 난 이후의 값의 타입이 무엇인가에 따라서 다르게 작성해주어야 합니다.

더보기

void : 리턴값의 타입이 없음

int   : 리턴값의 타입이 정수형

double : 리턴값의 타입이 실수형

String : 리턴값의 타입이 문자열

char : 리턴값의 타입이 문자

boolean : 리턴값의 타입이 bool

만일 리턴타입이 존재하게 작성을 한다면 우리는 반드시

내부에 return을 작성하여 그에 맞는 타입을 return해주어야합니다.(자동 형태변환)

//예시2
namespace ConsoleApp1
{
    class Program
    {
        static int plus(int a, int b)
        {
            return a+b;
        }
        static void Main(string[] args)
        {
            int a = 10;
            int b = 20;

            int c = plus(a, b);
            Console.WriteLine(c);
        }
    }
}

위 코드를 보면 예시1에서 사용했던 void가 아닌 int로 작성되어있는 것을 볼 수 있습니다.

위에 설명했던 것 처럼 int 타입으로 값을 리턴한다는 이야기 입니다.

이렇게 리턴타입이 있을경우 메인 함수에서는 그 리턴된 값을 받아줄 변수가 하나 필요하며

이 변수에 리턴된 값을 담아 출력된 것을 볼 수 있습니다.

 

위 예시1은 리턴값이 없어 메서드 기능에서 출력시킨 것


1-1. call by value (간접 참조)
1-2. call by reference (직접 참조)

이 두개를 한번에 정리하는 이유는 하나는 직접 참조이고 하나는 간접 참조이므로 둘이 비교하며 보여드리면

조금 더 이해가 쉬울 것 이기 때문입니다.

 

namespace ConsoleApp1
{
    class Program
    {
    	static void Swap(int a, int b)
        {
            int temp; 
            temp = a;
            a = b;
            b = temp;
        }// 두 변수의 값을 맞바꿔주는 swap 메서드
        
        static void Main(string[] args)
        {
            int a = 10;
            int b = 20;

            Console.WriteLine($"Swap메서드 실행 전: a={a}, b={b}");

            Swap(a, b);

            Console.WriteLine($"Swap메서드 실행 후: a={a}, b={b}");
        }
    }
}

위 코드를 보시면  a는 10 , b는 20의 값을 담고 있습니다.

이를 출력문으로 확인해주고 swap메서드를 이용하여 두 변수에 담긴 값을 맞바꿔줍니다.

이 값이 잘 바뀌었는지 확인해보면

값이 바뀌지 않은 것을 볼 수 있습니다.

이는 call by value 즉 간접참조 형식을 사용했음을 할 수 있는데요.

이는 메서드에서 매개변수 값을 복사하여 내부적으로 처리한 것 입니다.

 

위 코드는 리턴값이 없는 void Swap(int a, int b) 메서드 인 것을 확인 할 수 있습니다.

매개변수를 받으면서 int a와 int b라는 공간을 만들고 내부 코드를 돌립니다. 하지만

메인 메서드 내부에서 값을 받아주지 않았으니까 Swap()메서드 영역이 종료되면서

복사된 a와 b의 공간이 같이 사라진 것 입니다.

그래서 메인으로 돌아왔을 때 a와 b값은 그대로인 것이죠.

 

이를 해결하고 싶을 때 우리는 call by reference(직접참조) 형식을 사용하면됩니다.

예시를 들어보겠습니다.

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            int b = 20;

            Console.WriteLine($"Swap메서드 실행 전: a={a}, b={b}");

            Swap(ref a,ref b); //변경점 : ref

            Console.WriteLine($"Swap메서드 실행 후: a={a}, b={b}");
        }

        static void Swap(ref int a,ref int b) //변경점 : ref
        {
            int temp; 
            temp = a;
            a = b;
            b = temp;
        }
    }
}

이렇게 ref(erence) 를 메서드 호출과 메서드 생성시 매개변수에 넣어주면서

메모리 주소값에 직접적으로 관여해 값을 바꾸는 형식으로 해결할 수 있습니다.


2. 메서드 오버로딩 (overloading)

메서드 오버로딩은 메서드의 이름이 같을 때 매개변수의 타입과 갯수에 따라서 실행을 다르게 하는 시스템입니다.

method A(int a, int b)
{
	return a+b;
}

method A(int a, int b, int c)
{
 	return a+b+c;
}

예시와 같이 같은 이름을 가진 두개의 메서드 A가 있습니다. 

우리가 메인메서드에서 A메서드를 호출해줄 때 메서드 이름만 가지고 컴퓨터가 메서드영역을 불러온다면 [Ex) A(1,2)]

첫 A 메서드는 실행이 되어도 두번째 A메서드에서는 매개변수 부족으로 인한 오류가 나기 때문에

프로그램은 망가지게 됩니다.

이를 방지해 주는 것이 메서드 오버로딩입니다.

매개변수의 갯수 또는 타입을 구분하여 메인 메서드에서 A(1,2) 로 호출시 첫 A메서드만 호출 되는 것 입니다.

예시로 보자면

namespace ConsoleApp1
{
    class Program
    {
        static int Plus(int a, int b)// 정수형 매개변수 두개
        {
            Console.Write("int 끼리 더합니다.");
            return a + b;
        }

        static int Plus(int a, int b, int c)// 정수형 매개변수 세개
        {
            Console.Write("int 끼리 더합니다.");
            return a + b + c;
        }

        static double Plus(double a, double b)// 실수형 매개변수 두개
        {
            Console.Write("double 끼리 더합니다.");
            return a + b;
        }
        static void Main(string[] args)
        {
            Console.WriteLine(Plus(10, 20));//출력문(함수호출)
            Console.WriteLine();
            Console.WriteLine(Plus(10.5, 20.5));
            Console.WriteLine();
            Console.WriteLine(Plus(10, 20, 30));
            Console.WriteLine();
        }
    }
}

셋 다 같은 Plus 라는 이름을 가진 메서드이지만 그 결과를 보면

 

이렇게 각 메서드가 잘 호출되어 나타난 것을 알 수 있습니다.

'C#' 카테고리의 다른 글

[C#_10_(1)] Class  (0) 2021.10.08
[C#_9] 배열 (Array)  (0) 2021.10.07
[C#_7] 반복문 제어 (Break, Continue, goto)  (0) 2021.09.29
[C#_6] 반복문(for,foreach,while,do while)  (0) 2021.09.24
[C#_5] 조건문 (if, else, switch)  (0) 2021.09.23

+ Recent posts