C#

[C#]params 키워드로 매개변수 여러개 받아오기

DevStory 2021. 8. 18.

C#에서 매개 변수의 개수가 다르다는 이유로 메서드를 오버로딩하는 경우가 종종 있습니다.

 

메서드의 로직은 큰 변경사항이 없는데, 매개 변수의 개수 때문에 메서드를 오버로딩하는 것은 불필요한 코드를 남발하는 행위이며, 코드의 가독성을 저하시킵니다.

 

C#은 이러한 문제를 해결할 수 있는 "가변길이 매개 변수"라는 기능을 제공합니다.

 

이번 포스팅에서는 params 키워드와 배열을 이용한 가변길이 매개 변수에 대해 정리합니다.

 


가변길이 매개 변수의 필요성

매개 변수 값의 총합을 반환하는 메서드를 구현한다고 합시다.

 

매개 변수의 개수는 2개일 수도 있고 3개일 수도 있고 4개일 수도 있습니다.

int SumFunc(int a, int b)
{
  return a + b;
}

int SumFunc(int a, int b, int c)
{
  return a + b + c;
}

int SumFunc(int a, int b, int c, int d)
{
  return a + b + c + d;
}

위 코드는 매개 변수의 개수가 다르다는 이유로 메서드를 여러 번 오버로딩하는 문제가 발생합니다.

 

이러한 방식은 코드의 가독성을 저하시키고 불필요한 코드를 늘리게 됩니다.


params 키워드와 배열을 사용

SumFunc 메서드의 매개변수를 params 키워드와 배열로 작성합니다.

 

SumFunc 메서드에 전달된 변수는 SumFunc 메서드의 배열 arr에 담깁니다.

 

배열 arr params 키워드와 배열을 사용하여 매개 변수의 개수를 가변적으로 처리하는 가변길이 매개 변수입니다.

int SumFunc(params int[] arr)
{
  int sum = 0;
  
  for(int loop = 0; loop < arr.Length; i++)
  {
    sum += arr[loop];
  }
  
  return sum;
}

static void Main(string[] args)
{
  int totalValue = 0;
  int a = 10;
  int b = 20;
  int c = 30;

  totalValue = SumFunc(a, b, c);
  totalValue = SumFunc(a, b);
  totalValue = SumFunc(a);
}

메서드의 우선순위

가변길이 매개 변수를 사용한 PrintFunc 메서드와 2개의 매개 변수를 받는 PrintFunc 메서드가 존재합니다.

 

매개 변수의 개수가 동일한 메서드를 우선으로 실행합니다.

static void PrintFunc(params int[] arr)
{
  Console.WriteLine("PrintFunc(params int[] arr)");
}

static void PrintFunc(int a, int b)
{
  Console.WriteLine("PrintFunc(int a, int b)");
}

static void Main(string[] args)
{
  int totalValue = 0;
  int a = 10;
  int b = 20;

  PrintFunc(a, b);
}

실행 결과


params 키워드의 특징

  • 인수가 전달되지 않으면, 배열의 길이는 0입니다.
  • 배열의 크기를 정의할 필요가 없습니다.
  • params 키워드는 한 개만 가능합니다.
  • 매개변수의 개수가 변동되는 상황에서 유용합니다.

 

params 키워드를 사용한 가변 길이 매개변수는 마지막에 위치해야 합니다.

void PrintFunc(string s, params object[] arr)
{
// ...
}

 

가변길이 매개 변수 뒤에는 매개 변수가 올 수 없습니다.

아래 코드는 가변길이 매개 변수 뒤에 매개 변수가 존재하므로 에러가 발생합니다.

void PrintFunc(params object[] arr, string s)
{
// ...
}

object 타입인 경우

전달하고자 하는 값의 타입이 애매모호한 경우 object 타입의 가변길이 매개 변수를 사용할 수 있습니다.

static void PrintFunc(params object[] arr)
{
  for (int loop = 0; loop < arr.Length; loop++)
  {
    Console.Write(arr[loop] + (loop < arr.Length - 1 ? ", " : ""));
  }
  Console.WriteLine();
}

static void Main(string[] args)
{
  PrintFunc("Hi", 29, 'X', 10.252);
}

실행 결과

반응형

댓글