안녕하세요. 박민성입니다. 🤗
오늘은 C#에 params에 대해서 글을 쓰고자 합니다. 🤔
써본적도 없고 본적도 없는 키워드라서 이게 뭐지? 하고 공부하게 되었습니다.
1. params란?
params는 메서드가 같은 타입의 인수를 원하는 개수만큼 받을 수 있게 하는 키워드야.
private int Sum(int[] numbers)
{
int result = 0;
foreach (int number in numbers)
{
result += number;
}
return result;
}
일반적인 배열 매개변수는 이렇게 선언하여서
int[] numbers = { 1, 2, 3 };
int result = Sum(numbers);
호출할 때 배열을 직접 만들어서 넣습니다.
하지만.
private int Sum(params int[] numbers)
{
int result = 0;
foreach (int number in numbers)
{
result += number;
}
return result;
}
params를 사용하게 된다면?
int result = Sum(1, 2, 3);
호출할 때 값을 하나씩 전달할 수 있습니다.
params는 배열 매개변수를 사용하면서도 호출할 때는 여러 인수를 각각 전달할 수 있도록 해주는 키워드입니다.
2. 기본 사용법
접근제한자 반환형 메서드명(params 자료형[] 매개변수명)
{
}
이런 형태로 사용합니다.
private void PrintNames(params string[] names)
{
foreach (string name in names)
{
Debug.Log(names.Length);
Debug.Log(names[0]);
}
}
PrintNames("민수", "철수", "영희");
매개변수 names는 메서드 내부에서 일반 배열처럼 사용할 수 있습니다.
내부적으로는 배열로 처리 되기 때문입니다.
Sum(10, 20, 30);
Sum(new int[] { 10, 20, 30 });
두 개는 개념적으로 다음과 비슷하게 처리가 됩니다.
params가 여러 개의 독립적인 매개변수를 생성하는 것은 아닙니다.
params가 붙어 있어도 배열을 직접 전달할 수도 있습니다.
int[] numbers = { 10, 20, 30 };
int result = Sum(numbers);
Sum(10, 20, 30);
Sum(new int[] { 10, 20, 30 });
여러 값을 하나씩 전달 가능하고 기존 배열을 그대로 전달 가능합니다.
3. 인수를 하나도 전달하지 않으면 어떻게 될까요~?
Sum();
이런식으로 쓰면 가능은 합니다.
private int Sum(params int[] numbers)
{
Debug.Log(numbers.Length); // 0
return 0;
}
메서드 내부에서는 numbers는 null이 아니라 길이가 0인 배열로 처리됩니다.
하지만 명시적으로 null을 전달하면 nembers가 null이 될 수 있으니 주의가 필요합니다.
Sum(null);
4. params의 사용 규칙
반드시 배열 형식이어야 합니다.
private void Print(params int[] numbers) // OOOOOO
{
}
private void Print(params int number) // XXXXXXX
{
}
메서드당 하나만 사용 가능합니다.
private void Print(params int[] numbers, params string[] names) // XXXXXX
{
}
반드시 마지막 매개변수여야 합니다.
private void Print(string title, params int[] numbers) // OOOOOO
{
}
private void Print(params int[] numbers, string title) // XXXXXX
{
}
컴파일러가 어디까지를 numbers의 값으로 봐야 하는지 구분하기 어렵기 때문에 마지막에만 사용할 수 있습니다.
약간 매개변수 디폴트 값은 마지막 매개변수에 해야 하는 거와 비슷하죠?
5. params의 장점과 주의 사항
호출 코드가 짧고 읽기 쉬고 호출자가 배열을 직접 만들 필요가 없습니다.
약간 장점이자 단점인거 같습니다...
주의 사항은
Sum(1, 2, 3);
이처럼 값을 개별적으로 전달하면 이것을 담을 배열이 만들어질 수 있습니다.
그렇기 때문에 반복문이나 Update 등 이런 곳에서 돌리게 된다면 메모리 할당과 GC에 부담이 생길 수 있기 때문에 주의 하셔야 합니다.
이렇게 오늘은 C#에 params에 대해서 알아보았는데요~!
솔직히 별로 많이 사용될 것 같지도 않고... 그닥...? 굳이..?라는 생각이 많이 들었습니다. 🤔
그래도 어디선가는 사용되지 않을까...? 라고 생각합니다.
오늘의 노래 추천은
Dominic Fike - Babydoll이라는 곡입니다.
I can't move on, babydoll~
Waitin' on calls, flippin' through stations
I'm outclassed and it's outrageous
내일은 더욱 알차게 보내고 작성해 보도록 하겠습니다.
봐주셔서 감사합니다. ☺️