Skip to main content

[This is C#] Chapter 6. 메소드로 코드 간추리기

이것이 C#이다 책을 읽고 공부한 노트입니다.




메소드 #

  • 메소드(Method)
    • C와 C++에서의 함수(Function)나 파스칼에서의 프로시저(Procedure)와 같은 것이다.

  • 매개변수(Parameter)
    • 메소드가 호출자에게서 전달받은 값을 받는 변수.
  • 인수(Argument)
    • 호출자가 매개변수에 넘기는 값.
class Cal
{
    public static int Plus(int a, int b) // a, b는 매개변수
    {
        return a + b;
    }
}

class MainApp
{
    static void Main(string[] args)
    {
        Cal.Plus(4, 5); // 4, 5는 인수
    }
}



참조에 의한 전달 #

  • ref 키워드를 메소드의 매개변수 앞에 사용한다. 그리고 호출할 때 ref 키워드를 인수 앞에 사용한다.
class MainApp
{
    static void Swap(ref int a, ref int b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
    
    static void Main(string[] args) 
    {
        int x = 1, y = 2;

        Swap(ref x, ref y);

        Console.WriteLine("{0}, {1}", x, y); // 2, 1
    }
}



참조 반환값 #

  • ref 키워드를 메소드의 반환값 앞에 사용한다. 그리고 return문이 반환하는 변수 앞에도 사용한다.
  • 참조로 반환되는 결과를 담는 지역 변수를 참조 지역 변수(Ref local)라고 한다.
class Product
{
    private int price = 100;

    public ref int GetPrice() 
    {
        return ref price;
    }

    public void PrintPrice()
    {
        Console.WriteLine(price);
    }
}

class MainApp
{
    static void Main(string[] args)
    {
        Product product = new Product();

        // 참조 지역 변수 pref
        ref int pref = ref product.GetPrice();
        pref = 200;

        product.PrintPrice(); // 200
    }
}



출력 전용 매개변수 #

  • 두 개 이상의 결과를 요구하는 메소드는 어떻게 만들까?
    • ref보다 좀 더 안전한 out을 사용한다.
  • 출력 전용 매개변수는 out 키워드를 사용한다.
    • 해당 매개변수에 결과를 저장하지 않으면 컴파일러가 에러 메시지를 출력한다.
    • out으로 전달된 값을 사용할 수 없다.
    • 해당 매개변수로 전달할 변수들을 미리 선언할 필요는 없다. (아래 코드의 c, d의 경우)
static void Divide(int a, int b, out int quotient, out int remainder)
{
    quotient = a / b;
    remainder = a % b;
}

static void Main(string[] args)
{
    int a = 20, b = 3;
    Divide(a, b, out int c, out int d);
    
    Console.WriteLine("{0}, {1}", c, d); // 6, 2
}



메소드 오버로딩 #

  • 메소드 오버로딩(Overloading)

    • 하나의 메소드 이름으로 여러 개를 구현한 것이다.
  • 방법

    • 메소드의 이름을 같게 한다.
    • 메소드의 파라미터를 다르게 한다.



가변 개수의 인수 #

  • 개수가 유연하게 변할 수 있는 인수이다.
    • params 키워드와 배열을 이용해서 선언한다.
static int Sum(params int[] args)
{
    int sum = 0;

    for (int i = 0; i < args.Length; i++)
        sum += args[i];

    return sum;
}

static void Main(string[] args)
{
    int sum = Sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

    Console.WriteLine(sum); // 55
}



명명된 인수 #

  • 메소드를 호출할 때 인수의 이름에 근거해서 데이터를 할당할 수 있는 기능이다.
  • 인수가 너무 많아서 어느 매개변수에 어느 인수를 할당하고 있는지 분간이 어려운 경우에 도움이 될 수 있겠다.
static void PrintProfile(string name, string phone)
{
    Console.WriteLine($"{name}, {phone}");
}

static void Main(string[] args)
{
    PrintProfile(name: "박찬호", phone: "000-0000-0000");  // 박찬호, 000-0000-0000
}



선택적 인수 #

  • 매개변수에 기본값을 줄 수 있다. 그리고 기본값을 가진 매개변수는 메소드를 호출할 때 인수를 생략할 수 있다.
    • 주의할 점은, 이러한 선택적 인수는 항상 필수 인수 뒤에 와야 한다는 것이다.
static void PrintProfile(string name, string phone = "")
{
    Console.WriteLine($"{name}, {phone}");
}

static void Main(string[] args)
{
    PrintProfile(name: "박찬호");  // 박찬호, 
}



로컬 함수 #

  • 로컬 함수는 메소드 안에서 선언되고, 선언된 메소드 안에서만 사용되는 특별한 함수이다.
class SomeClass
{
    public void SomeMethod()
    {
        int count = 0;
        SomeLocalFunction(1, 2);

        void SomeLocalFunction(int a, int b)
        {
            //...
            count++;  // 지역 변수를 사용할 수 있다. 
        }
    }
}