본문 바로가기

   
Programming/C#

메서드, 재귀 메서드, 지역변수

반응형

- 특정 행동을 취하는 코드의 집합

 - 함수(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);

        }

    }

}

 
  2. Call By Reference

    - 주소에 의한 전달

    - 메서드 호출 시 주소값을 복사해서 전달하는 방식

    - 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. 기능 : 매서드명, 인자의 자료형, 인자의 갯수

     2. 불가능 : 반환값 자료형, 인자의 이름



- *.cs 파일안에서 코딩중..

             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();

        }

    }

}

 

 












 
반응형