ch06 메소드로 코드 간추리기

2020. 1. 9. 19:37C# 언어/이것이 C# 이다. 책정리

반응형

 

챕터 06  '메서드'입니다.

메서드를 이용하여 프로그램의 덩치가 커져도 여전히 간결하고

이해하기 좋게 소스 코드를 유지할 수 있는 방법을 배웁니다!

 

'이것이 C#이다' 교재를 바탕으로 정리했습니다.

 

이전 정리 글

 


 

ㅇ 메소드란 ?

메서드는 객체 지향 프로그래밍 언어에서 사용하는 용어로

 일련의 코드를 하나의 이름 아래 묶은 것 

입니다.

 

class 클래스_이름
{
    한정자 반환 형식 메서드의_이름( 매개 변수_목록)
    {
        // 실행하는 코드
        // 실행 하는 코드
        // 실행 하는 코드
         
         retrun 메서드의_결과;
     }
}
  • 메서드가 함수, 프로시저, 서브루틴 등과 다른 점은 클래스 안에 존재한다는 것
  • 매개 변수와 반환 형식을 가짐

 

메서드 이용한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace p186
{
    class Calculator
    {
        public static int Plus(int a, int b)
        {
            return a + b;
        }
        public static int Minus(int a, int b)
        {
            return a - b;
        }
    }
    class Program
    {
        static void Main()
        {
            int result = Calculator.Plus(34);
            Console.WriteLine(result);
 
            result = Calculator.Minus(52);
            Console.WriteLine(result);
 
        }
    }
}

 

ㅇ return에 대하여

return 문은 점프 문의 한 종류이다.

프로그램의 흐름을 갑자기 호출자에게 돌려놓음.

 

메서드 이용한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using static System.Console;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace p189
{
    class MainApp
    {
        static int Fibonacci(int n)
        {
            if (n < 2)
                return n;
            else
                return Fibonacci(n - 1+ Fibonacci(n - 2);
        }
 
        static void ProintProfile(string name, string phone)
        {
            if(name == "")
            {
                WriteLine("이름을 입력해주세요.");
                return;
            }
            WriteLine($"Name:{name},Phone:{phone}");
        }
        static void Main(string[] args)
        {
            Console.WriteLine($"5번째 피보나치 수 : {Fibonacci(10)}");
 
            ProintProfile("""123-45677");
            ProintProfile("박상현""14125677");
        }
    }
}

ㅇ 매개 변수에 대해서

매개 변수는 메소드 외부에서 메소드 내부로 데이터를 전달하는 매개체 역할을 할 뿐이지

근본적으로는 "변수"입니다.

     

표에 언급한 모든 메서드 이용한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using static System.Console;
namespace ex
{
    class Calculator
    {
        public static int Plus(int a, int b)
        {
            Console.WriteLine("Input : {0}, {1}", a, b);
 
            int result = a + b;
            return result;
        }
 
        class MainApp
        {
            public static void Main()
            {
                int x = 3;
                int y = 4;
 
                int result = Calculator.Plus(x, y);
            }
        }
    }
 
}

a는 x가 갖고 있는 것과 똑같은 데이터를 갖고 있지만 a와 x는 완전히 별개의 메모리 공간을 사용합니다.

b와 y의 관계도 마찬가지고요. 따라서 a를 수정한다고 해도 x는 아무런 영향을 받지 않습니다.

 

값에 의한 전달
public static void Swap(int a, int b)
{
    int temp = b;
    b = a;
    a = temp;
}

static void Main(string args [])
{
    int x = 3;
    int y = 4;
   Swap( x , y );
}

메서드가 매개 변수를 받아들일 때에는 데이터의 "복사"가 이루어짐

Swap() 메서드의 첫 번째 매개 변수 a는 x가 담고 있는 3을 복사해서 받고

두 번째 매개 변수 b는 y가 담고 있는 4를 복사해서 받음

그렇기 때문에 Swap() 메소드 안에서 아무리 두 매개 변수를 바꿔도

Main() 메소드 안에서 선언된 x와 y에는 영향이 없음

메서드를 호출할 때 데이터를 복사해서 매개 변수에 넘기는 것을 "값에 의한 전달"이라고 함

 

참조에 의한 전달 (ref 키워드)

위에 Swap() 함수가 의도한 대로 실행되기 위해서는 값을 복사하는 것이 아니라 

원본 변수를 직접 참조해야 합니다.

C#에서 참조에 의한 매개 변수 전달은 ref 키워드의 도움만 있으면 됩니다.

public static void Swap(ref int a, ref int b)

{

    int temp = b;

    b = a;

    a = temp;

}


static void Main(string args [])

{

    int x = 3;

    int y = 4;

   Swap(ref x , ref y ); // ref 키워드로 된 매개 변수를 호출할 때도 ref키워드를 사용해서 호출

}

ㅇ 출력 전용 매개 변수

메소드의 결과가 두 개 이상의 결과를 요구하는 특별한 메소드가 있다면

ref, out 키워드를 사용하여 편리하게 관리할 수 있습니다.

 

ref
  • Call By Reference 방식 ( 참조 방식 )
  • 메서드로 전달되기 전에 무조건 초기화가 되어 있어야 합니다.
  • 메서드 안에서 반드시 값을 할당 할 필요는 없습니다.

예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using static System.Console;
namespace ex
{
    class MainApp
    {
        static void Divide(int a, int b, ref int quotient, ref int remainder)
        {
            quotient = a / b;
            remainder = a % b;
        }
 
        static void Main()
        {
            int a = 20;
            int b = 3;
            int c = 0;
            int d = 0;
 
            Divide(a, b, ref c, ref d);
 
            WriteLine($"{c},{d}");
        }
    }
 
}

 

out
  • Call By Reference (참조 방식)
  • 파라미터는 메서드 내에서 그 값을 반드시 지정하여 전달하게 되어 있습니다.
  • 그 이전의 값은 무시됩니다. 초기화할 필요 없고 선언만 되어 있으면 됩니다.
  • 해당 매개변수는 리턴하기전 혹은 메서드의 안에서 무조건 할당이 되어야 합니다.
  • 선언된 매개변수의 수정은 메서드 외부에서도 볼 수 있습니다.

예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using static System.Console;
namespace ex
{
    class MainApp
    {
        static void Divide(int a, int b, out int quotient, out int remainder)
        {
            quotient = a / b;
            remainder = a % b;
        }
 
        static void Main()
        {
 
 
            int a = 20;
            int b = 3;
            //int c = 0;
            //int d = 0;
 
            Divide(a, b, out int c, out int d); // 미리 선언할 필요가 없음
                                                // 호출할 때 매개 변수 목록 안에서
                                                // 즉석으로 선언하면 됨
 
            WriteLine($"{c},{d}");
        }
    }
 
}

ㅇ 메소드 오버로딩

하나의 메소드 이름에 여러 개의 구현을 올리는 것을 뜻함

오버로딩을 해놓으면 컴파일러가 메소드 호출 코드에 사용되는 매개 변수의 수와 형식을 분석해서

어떤 메소드 버전이 호출될지를 찾아줌

 

메소드 이용한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;
using static System.Console;
 
namespace p203
{
    class MainApp
    {
        static int Plus(int a, int b)
        {
            WriteLine($"Plus(int, int) 메소드입니다.");
            return a + b;
        }
 
        static int Plus(int a, int b, int c)
        {
            WriteLine($"Plus(int, int, int) 메소드입니다.");
            return a + b + c;
        }
 
        static double Plus(double a, double b)
        {
            WriteLine($"Plus(double, double) 메소드입니다.");
            return a + b;
        }
 
        static double Plus(int a, double b)
        {
            WriteLine($"Plus(int, double) 메소드입니다.");
            return a + b;
        }
        static void Main(string[] args)
        {
            Plus(34);
            Plus(34.5);
            Plus(1,2,3);
            Plus(3.4,3.1);
        }
    }
}

ㅇ 가변길이 매개 변수

그 개수가 유연하게 변할 수 있는 매개 변수를 말합니다.

params 키워드와 배열을 이용해서 선언합니다.

 

메소드 이용한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using static System.Console;
 
namespace p205
{
    class MainApp
    {
        static int Sum(params int[] args)
        {
            WriteLine("Summing....");
            int sum = 0;
 
            for (int i = 0; i < args.Length; i++)
            {
                if (i > 0)
                    Write(",");
 
                Write(args[i]);
                
                sum += args[i];
            }
            WriteLine();
 
            return sum;
 
        }
        static void Main(string[] args)
        {
            int sum =
                Sum(3456789101112);
 
            WriteLine($"Sum : {sum}");
        }
    }
}

반응형