- 특정 행동을 취하는 코드의 집합
 - 함수(Function), 프로시저(Procedure) 등..
 - 객체의 행동 
 - 강제성은 없으나 어떤 특정 행동에 대한 코드들을 그룹으로 묶어 관리하는 측면
 - 정적메서드(공용) vs 객체메서드(멤버) 
클래스 안에서만 선언 가능 클래스 자식 수준에서 선언 가능
메서드 안에 메서드 선언 불가능, 모든 코딩은 메서드 안에서
이루어 진다.
클래스 밖에서 선언 한것은 자료형이라는것을 생성하기 위한 Enum,
Struct 를 제외한 모든 것들은 클래스 내에 기록된다.
 - 모든 메서드는 클래스의 자식(멤버)
1. 메서드 선언(정의)
   - 접근지정자 정적키워드 반환형 메서드명(인자리스트)
 {
      메서드 본문(body)
 }
2. 메서드 호출(실행)
   - 메인 메서드는 계속 실행되게 되있으며 우리가만든 메서드는 직접적으로 호출하지 않는경우 메서드 호출이 되지
않는다.
C#에서의 코드의 실행순서(제어 흐름)는 위에서 아래로 라인단위!! -> Main()메서드의 첫줄부터
흐름이 시작 ..*******************
메서드 호출이 시작되면 제어 흐름이 위에서 아래에서 선언된 메소드로 이동하면서 위에서 아래로 흐르지 않는다.
 
* 메서드 사용 장점 
 - 유지 보수성이 높다.
 - 코드의 수정이 용이
 - 개발성이 높다(생산성이 높다.
적은 코드의 동일한 업무가 가능)
 - 가독성이 높다(코드의 성질에 따라 영역이 분리) 
*** 무조건 2회이상 반복되는 코드가 발생하면 무조건 메서드를 만들어서
사용하도록 한다.
*** 하나의 메서드안에서 각각의 성질을 갖는 코드 집합이 2개 이상이
되면 메서드를 만들어서 사용
      메서드 a 메서드 b로
빼서 호출 메서드는 계속 쪼개고 쪼개기 떄문에 메소드 집합이 된다.
 
 using System;
namespace Csharp
{
    class Test
    {
        public static void Main(string[] args) 
        {
            //요구사항] "안녕하세요" x 5회 출력
           //요구사항] "하나"-"다섯" x 5회 출력 
            Console.WriteLine("안녕하세요");
            Console.WriteLine("안녕하세요");
            Console.WriteLine("안녕하세요");
            Console.WriteLine("안녕하세요");
            //메서드 호출
            //메서드명(인자리스트);
            Hello();//Hello()
메서드로 이동하세요
            Hello();
            Hello();
            Hello();
            Hello();
            Num();
            Num();
            Num();
            Num();
            Num(); 
        }
      //메서드 생성 
        public static void
Hello()             
        {
            Console.WriteLine("Hello");
        }//메서드를 모두 읽은후 자기가 호출한 곳으로 돌아간다.
        public static void Num()
        {
            Console.WriteLine("하나");
            Console.WriteLine("둘");
            Console.WriteLine("셋");
            Console.WriteLine("넷");
            Console.WriteLine("다섯");               
        }
 
    }
}
메서드의 행동 분류 => 메서드는 어떠한 행동
 1. 인자가 없고 반환값이 없는 메서드
 2. 인자가 있고 반환값이 없는 메서드 
 3. 인자가 없고 반환값이 있는 메서드 
 4. 인자가 있고 반환값이 있는 메서드 
인자
 - Parameter, 매개변수
 - 메서드를 실행할때 건네주는 데이터
 - 메서드의 가용성 높이기 위해..(좀더 쓸모있는 메서드)
 - 인자는 1개 이상 사용이 가능 약 250개 정도 사용할수 있다.
 - 모든 자료형이 가능 (인티져,
플롯, 블리언)
인자의 타입과 갯수와 순서는 반드시 지켜서 호출!
using System;
namespace Csharp
{
    class Test
    {
        public static void Main(string[] args) 
        {
            /*---------------------------------------------------------
            지역변수(Local Variable)
             - 메서드안에서 선언된 변수
             - 지역변수의 영역 : 변수선언문이 속해있는
메서드 {}
                => 지역변수의 생명주기(Life Cycle)
                   : 변수가 언제 메모리에 생성 - 언제 메모리에서
소멸
             - 생성되는 시점 : 선언문이 실행될떄..
             - 소멸되는 시점 : 선언문이 포함된 블럭에서
제어가 벗어날때
           
---------------------------------------------------------*/
             //1. 인자가 없고 반환값이 없는 메서드  
            Hello1();
            Hello2();
            //2. 인자가 있고 반환값이 없는 메서드
            //Mr Kim
: 실인자(진짜인자)
            Hello3("Mr
Kim");
            Hello4(10, "KJH");
        }
        /*--------------------------------------------
        1. 인자가 없고 반환값이 없는 메서드  
         - void : 반환값이 없는 
         - (없음) : 인자가 없는
         호출이 되면 메서드안의 코드만 실행시키고 종료
        
--------------------------------------------*/
        public static void Hello1()
        {
            Console.WriteLine("Hi~");                
        }
        public static void Hello2()
        {
            Console.WriteLine("Hi~~ Mr kim");
        }          
        
        /*--------------------------------------------------------
        2. 인자가 있고 반환값이 없는 메서드
         - 인자 : 모든 타입의 변수
                : 메서드 {]안에서는 일반 지역변수와 동일하게
사용
         string name : 가인자(가짜)
        
--------------------------------------------------------*/
        public static void Hello3(string name)
        {
            Console.WriteLine("Hi~~~Mr {0}님", name);                            
        }
        public static void Hello4(int count, string
name)
        {
            for
(int i=1; i<count; i++) 
            {
                Console.WriteLine("Hi~~{0}", name);
            }
        }
    }
}
반환값
 - 메서드를 실행한 후 돌려받는 데이터
 - 메서드의 가용성을 높이기 위해...
 - 반환값은 단 1개..
 - 모든 자료형이 가능
using System;
namespace Csharp
{
    class Test
    {
        public static void Main(string[] args) 
        {
            //호출 구문이 사라지고 리턴된 곳으로 값을 준다.
            int
result = GetNum();//반환값을 받아서 처리..
            Console.WriteLine(result);
            
            int
a = 10, b = 20;
            int
result2 = Sum(a, b);
            
            Console.WriteLine("{0} + {1} = {2}", a, b, result2);
        }       
        
        //3. 인자가 없고 반환값이 있는 메서드
        public static int GetNum()
        {
            int
num = 10;
            //반환값이 있는 메소드
            //리턴문이 빠져서는 절대 안된다.
            return
num;
            //return
20; 상수를 넣어도 된다. 고정값 반환 변수를 넣게되면 그때마다 다른값을 받는다.
        }
        //4. 인자가 있고 반환값이 있는 메서드
        public static int Sum(int a, int b)
        {
            int
result = a + b;
            return
result;
        }
    }
}
 
지역변수 이해 소스
using System;
namespace Csharp
{
    class Test
    {
        public static void Main(string[] args) 
        {
            //지역변수의 생명주기     
            //num이라는 변수가 언제 생성-소멸?
            //main메소드 실행중에 생성된 num 
            int
num = 20;
            Test1();
            
            Console.WriteLine("main num : {0}", num);
        }
        public static void Test1()
        {
            //context
폴더가 다른 같은 이름 num
            //main과 같이 스택에 생성된다.Test라는 메소드의 num이라는 것을 인식한다.
            int
num = 10;
            Console.WriteLine("Test1 num : {0}", num);
        }
    }
}
메서드 인자값의 전달 형태
 - 메서드를 호출할때 인자를 넘겨주는 방식
 1. Call By Value
    - 기본형
    - 값에 의한 전달
    - 메서드 호출 시 값자체를 복사해서 전달하는 방식
    - Side Effect가 없음.
    - 전달받은 매개변수를 매서드안에서 수정을 하더라도 매개변수 원본은 영향을 받지 않음.
using System;
namespace Csharp
{
    class Test
    {
        public static void Main(string[] args) 
        {
            int
a = 10, b = 20;
            Console.WriteLine("a : {0}, b : {1}", a, b);
            Swap(a,b);
            Console.WriteLine("a : {0}, b : {1}", a,b);
        }
        public static void Swap(int a, int b)
        {
            //바꾸기
            int
temp;//빈컵
            temp = a;
            a = b;
            b = temp;
            Console.WriteLine("a : {0} b : {1}", a, b);
        }
    }
}
    - 주소에 의한 전달
    - 메서드 호출 시 주소값을 복사해서 전달하는 방식
    - Side Effect가 있음.
    - 전달받은 매개변수를 메서드안에서 수정을 하면 원본도 영향을 받음
using System;
namespace Csharp
{
    class Test
    {
        public static void Main(string[] args) 
        {
            int
a = 10, b = 20;
            Console.WriteLine("a : {0} b : {1}", a, b);
            Swap(ref
a,ref b);
            Console.WriteLine("a : {0} b : {1}", a,b);
        }
        //주소값을 저장 ref int a, ref int b
        //호출후 주소 번지를 기억 변수값이 아님
        //temp 일반 값을 가질수 있는 변수
        //temp 는 a의 주소 값을 찾아 100번지를 찾아가 데이타10을 저장
        //다시 a로 갔더니 주소값 형태로 되어 있어
데이타를 못넣었다.
        public static void Swap(ref int a, ref int b)
        {
            //바꾸기
            int
temp;//빈컵
            temp = a;
            a = b;
            b = temp;
            Console.WriteLine("a : {0} b : {1}", a, b);
        }
    }
}
3. Output Parameter 
 
 
재귀 메서드 : Factorial(팩토리얼)
디렉터리 구조에서 많이 쓰인다.
폴더별로 갯수를 세서 형제가 있는지 본후 형제있으면 계속 들어간다.이러한
형태로 똑같은 행동을 계속한다.
using System;
namespace Csharp
{
    class Test
    {
        public static void Main(string[] args) 
        {
            //Factorial(팩토리얼)
            //4! = 4
x 3 x 2 x 1
            //Test1();
            int
result = Factorial(15);
            Console.WriteLine("4! = {0}",result);
        }      
        public static int Factorial(int n)
        {
            if
(n > 1)
                return
n * Factorial(n - 1);
            else
                return
1;
        }
        public static void Test1()
        {
            Console.WriteLine(DateTime.Now);
            //Test1();
        }
    }
}
매서드 오버로딩(Overloading) => 히드라, 져글링, 울트라 리스크를 태운다.
 - 매서드가 여러가지 형태(갯수,
타입)의 인자리스트를 가질 수 있게 해주는 기술
 - 매서드 시그너쳐(Signature), 매서드 서명 -> 싸인
       : 매서드를 구분할 수 있게 해주는 요소
 - 매서드 서명으로 사용 가능한 구성 요소
     1. 기능 : 매서드명, 인자의
자료형, 인자의 갯수
             1. public static void Test() 선언 // o 
             2. public static void Test(int n) // o  
             3. public static void Test(int m) // x (인자의 이름 다름)  / int m 이 2번이었다면 o 
             4. public static void Test(int n, int m) // o 
             5. public static void Test(string s)// o (인자의 타입이 다르므로)
             6. public static void Test(string s, byte b) // o
             7. public static int Test() // x (1번때문에)
             8. public static int Test(bool b) //o (유일하므로)
             9. public static void Test(ref int n)
Overloading
 - 메서드 오버로딩을 사용하는 이유
    1. 동일한 업무를 하는 매서드들이 인자를 달리하는 경우...
    2. 동일한 업무 => 메서드명 동일
    3. 기존에 업무가 존재하는데.. 거기에 비슷한 업무를 추가시키는
경우..
 - 메서드 오버로딩 자제
     - 1개의 이름을 가지고 여러가지 기능!! => 모호성(디버깅이 힘들어 질수 있다.) 
using System;
namespace Csharp
{
    class Overloding
    {
        public static void Main(string[] args) 
        {
           DrawLine();
           DrawLine();
           DrawLine('+');
           DrawLine('#');
           DrawLine(100);
           DrawLine(1000);
           DrawLine('@',
20);
           DrawLine('~',
40);
        }  
        
        public static void
DrawLine()
        {
            Console.WriteLine("==========");
            //선긋기
            //메서드의 다형성
        }
        //확장
        public static void DrawLine(char c)
        {
            for
(int i=0; i<10; i++)
                Console.Write(c);
            
            Console.WriteLine();//빈엔터
        }
        public static void DrawLine(int count)
        {
            for
(int i=0; i<10; i++)
                Console.Write('=');
            Console.WriteLine();
        }
        public static void DrawLine(char c, int count)
        {
            for(int i=0; i<10; i++)
                Console.WriteLine(c);
            Console.WriteLine();
        }
    }
}