C# 기초 정리: 메소드

define을 이용한 구구단 코딩 (……)

값에 의한 매개변수 전달(Call by Value)

  • 데이터를 복사해서 매개변수에 전달
  • 매개변수가 원본 데이터에 영향을 끼치지 않음
class Program
{
    public static void Swap(int a, int b)
    {
        int temp = a;
        a = b;
        b = temp;
    }

    public static void Main(string[] args)
    {
        int x = 1;
        int y = 2;
        Swap(x, y);
        Console.WriteLine("x: {0}, y: {1}", x, y); // Swap X
    }
}

 

참조에 의한 매개변수 전달(Call by Reference)

  • 매개변수가 원본변수를 직접 참조 및 제어
  • ref 키워드 사용
class Program
{
    public static void Swap(ref int a, ref int b)
    {
        int temp = a;
        a = b;
        b = temp;
    }

    public static void Main(string[] args)
    {
        int x = 1;
        int y = 2;
        Swap(ref x, ref y);
        Console.WriteLine("x: {0}, y: {1}", x, y); // Swap O
    }
}

 

출력 전용 매개변수(out)

  • ref 키워드로 한정된 매개변수는 값을 전달받지 않아도 경고가 발생하지 않음
  • out 키워드로 한정된 매개변수는 값을 전달받지 않으면 컴파일 에러 발생 (출력 전용 매개변수)
class Program
{
    public static void Divide(int a, int b, out int q, out int r)
    {
        q = a / b; // 몫
        r = a % b; // 나머지
    }

    public static void Main(string[] args)
    {
        int x = 5; // 피제수
        int y = 2; // 제수
        int quotient = 0; // 몫
        int remainder = 0; // 나머지

        Divide(x, y, out quotient, out remainder);

        Console.WriteLine("{0}를 {1}로 나눈 결과", x, y);
        Console.WriteLine("몫: {0}, 나머지: {1}", quotient, remainder);
    }
}

 

오버로딩(Overloading)

  • 하나의 메소드 명으로 여러 개의 메소드를 구현
class Program
{
    /* 반환 타입이 다른 메소드 오버로딩 */
    public static int Plus(int a, int b) { return a + b; }
    public static double Plus(double a, double b) { return a + b; }

    /* 매개변수 개수가 다른 오버로딩 */
    public static int Sum(int a, int b) { return a + b; }
    public static int Sum(int a, int b, int c) { return a + b + c; }

    public static void Main(string[] args)
    {
        Console.WriteLine(Plus(1, 2));
        Console.WriteLine(Plus(1.1, 3.14));
        Console.WriteLine(Sum(1, 3));
        Console.WriteLine(Sum(1, 3, 5));

    }
}

 

가변길이 매개변수(params)

  • params 키워드 사용
  • 내부 로직은 같으나 매개변수 개수만 다를 때 함수를 일일이 오버로딩할 필요가 없음
class Program
{
    public static int Sum(params int[] args)
    {
        int sum = 0;
        foreach (int a in args)
            sum += a;

        return sum;
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(Sum(1, 2, 3, 4, 5));
        Console.WriteLine(Sum(1, 3, 5));
    }
}

 

명명된 매개변수(Named Parameter)

  • 매개변수 이름 뒤에 콜론(:)을 붙인 뒤 그 뒤에 할당할 데이터를 입력
  • 매개변수를 순서대로 입력하지 않을 수 있음
class Program
{
    public static void PrintProfile(string name, string phone)
    {
        Console.WriteLine("이름: {0}, 핸드폰 번호: {1}", name, phone);
    }

    public static void Main(string[] args)
    {
        /* 명명된 매개변수(Named Parameter) 사용 */
        PrintProfile(phone: "010-1234-5678", name: "김씨샵");
    }
}

 

선택적 매개변수

  • 매개변수에 값을 할당하지 않아도 매개변수의 기본값을 지정할 수 있음
  • 논리는 동일하나 매개변수가 다른 경우 선택적 매개변수를 사용
  • 매개변수에 따라 논리가 달라지는 경우 메소드 오버로딩을 사용
class Program
{
    /* 선택적 매개변수로 구현된 메소드 */
    public static int Sum(int a=0, int b = 0)
    {
        return a + b;
    }

    public static void Main(string[] args)
    {
        Console.WriteLine(Sum()); // a = 0, b = 0 전달. 0 + 0 = 0
        Console.WriteLine(Sum(1)); // a = 1, b = 0 전달. 1 + 0 = 1
    }
}