본문 바로가기
C#/이론

[예제로 배우는 C# 프로그래밍] 메서드 파라미터

by 단월໒꒱ 2022. 7. 6.

 

C# 메서드 파라미터

 

 

메서드

 

  클래스 내에서 코드 블럭을 실행시키는 함수를 메서드라고 한다.

 

  메서드는 0~N개의 인수를 가질 수 있으며, 하나의 반환 값을 갖는다. 반환값이 없으면 리턴 타입을 void로 둔다. 또한 public, private 같은 접근 제한자를 리턴 타입 앞에 둘 수 있다.

 

 

public int GetData(int a, string b, bool c)
{
}

 

 

 

Pass by Value

 

  C#은 메서드에 인수를 전달할 때, 값을 복사해서 전달하는 Pass by Value 방식을 따른다.

 

  전달된 인수를 메서드 내에서 변경한다고 해도 메서드가 끝나고 함수가 리턴된 후에는 전달되었던 인수의 값은 호출자에서 원래 값 그대로 유지된다.

 

 

class Program
{
    private void Calculate(int a)
    {
        a *= 2;
    }

    static void Main(string[] args)
    {
        Program p = new Program();

        int val = 100;
        p.Calculate(val);  
        // val는 그대로 100        
    }
}

 

 

 

Pass by Reference

 

  메서드에 파라미터를 전달할 때, 참조 형식으로 전달하고자 하면 키워드 ref를 사용한다. ref를 사용할 경우, 메서드 내에서 변경된 값은 리턴 후에도 유효하다. ref를 사용하기 위해서는 ref로 전달되는 변수가 사전에 초기화되어야 한다.

 

  C#의 ref와 비슷한 기능을 하는 것으로 C# out 키워드가 있다. out을 사용하는 파라미터는 메서드 내에서 그 값을 반드시 지정하여 전달해야 한다. 

 

  ref는 해당 변수가 사전에 초기화되어야 하지만 out은 사전에 변수를 초기화할 필요가 없다.

 

 

// ref 정의
static double GetData(ref int a, ref double b)
{ return ++a * ++b; }

// out 정의
static bool GetData(int a, int b, out int c, out int d)
{
    c = a + b;
    d = a - b;
    return true;
}

static void Main(string[] args)
{
    // ref 사용. 초기화 필요.
    int x = 1;
    double y = 1.0;
    double ret = GetData(ref x, ref y);

    // out 사용. 초기화 불필요.
    int c, d;
    bool bret = GetData(10, 20, out c, out d);
}

 

 

 

C# 4.0 : Named 파라미터

 

  메서드에 파라미터를 전달할 때, 일반적으로 파라미터 위치에 따라 순차적으로 파라미터가 넘겨졌는데, 4.0 버전부터는 위치와 상관없이 파라미터 명을 지정하여 파라미터를 전달할 수 있게 되었다. 이러한 파라미터를 Named Parameter라고 한다.

 

 

Method1(name: "John", age: 10, score: 90);

 

 

 

C# 4.0 : Optional 파라미터

 

  4.0 버전부터 어떤 메서드의 파라미터가 기본값을 갖고 있다면, 메서드 호출 시 이러한 파라미터를 생략하는 것을 허용했다. 이렇게 기본 값을 가진 파라미터를 Optional parameter라고 한다.

 

  Optional parameter는 반드시 파라미터들 중 맨 마지막에 놓여져야 한다. 여러 개의 Optional parameter가 있을 경우, 반드시 Optional이 아닌 파라미터들 뒤에 위치해야 한다.

 

 

class Program
{
    // Optional 파라미터: calcType
    int Calc(int a, int b, string calcType = "+")
    {
        switch (calcType)
        {
            case "+":
                return a + b;
            case "-":
                return a - b;
            case "*":
                return a * b;
            case "/":
                return a / b;
            default:
                throw new ArithmeticException();
        }
    }

    static void Main(string[] args)
    {
        Program p = new Program();
        int ret = p.Calc(1, 2);
        ret = p.Calc(1, 2, "*");
    }
}

 

 

 

params

 

  일반적으로 메서드의 파라미터 개수는 고정되어 있다. 하지만 파라미터의 개수를 미리 알 수 없는 경우도 있는데, 이런 경우 키워드 params를 사용한다.

 

  이 params 키워드는 가변적인 배열을 인수로 갖게 해주는데, 파라미터들 중 반드시 하나만 존재해야 하며, 맨 마지막에 위치해야 한다.

 

 

//메서드
 int Calc(params int[] values)

//사용
int s = Calc(1,2,3,4);
s = Calc(6,7,8,9,10,11);

 

 

 

 

댓글