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);
}
실행 결과
'C#' 카테고리의 다른 글
[C#]DataTable에서 특정 Row만 추출하기 (0) | 2021.08.24 |
---|---|
[C#]DataTable RowState 강제로 변경 (0) | 2021.08.22 |
[C#]윤년 판별하기 isLeapYear 메서드 (0) | 2021.08.10 |
[C#]날짜 계산, 날짜 비교 (0) | 2021.08.10 |
[C#]현재 날짜 및 시간 가져오기 (0) | 2021.08.09 |
댓글