[C#] params 가변인자 매개변수에 대해서.
안녕하세요. BlockDMask 입니다.
오늘은 가변인자 매개변수 params 키워드에 대해서 알아보도록 하겠습니다.
날씨가 오락가락하네요.
1. C# params 가변 인자 매개변수란?
▼ C# params 설명과 기능
: 우리가 함수의 매개변수를 넘길때 1,2,3개 이렇게 개수를 지정해주었던 것과 달리, params 키워드를 사용하면 개수의 제한 없이 매개변수를 넘길 수 있습니다. (노올랍군요)
: 가변 인자 매개변수 = 개수가 변하는 인자들을 넘길 수 있는 매개변수.
▼ C# params 규칙
: 선언부에서 params 키워드는 타입 맨 앞에 와야합니다.
: 가변인자 매개변수를 선언할때는 [] 를 이용해서 1차원 배열로 선언해야합니다.
: 데이터 타입이 애매할때는 모든 클래스의 최상위 클래스인 object 클래스 배열로 해도 됩니다.
(object 클래스 예제는 아래 예제 2에 있습니다.)
: 호출부에서 각 매개변수는 쉼표로 구분을 해야합니다.
: 호출부에서 매개변수를 보내지 않아도 됩니다. 이 경우에는 길이가 0이 되고, 비어있는 매개변수가 됩니다.
▼ C# params 간단한 예제
선언 - public static void Add(params int[] mylist)
호출 - Add(1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 7, 6, 5, 4, 4, 3, 2, 2, 1, 2, 2, 1, 2, 3, 4, 5, 6, 7) (완전 가능)
제가 일부러 params 키워드와 1차원 배열을 나타내는 [] 를 빨간색으로 강조했습니다.
다시한번 말씀드리지만, params는 데이터 타입 앞에 와야하고, 데이터 타입은 []을 이용한 1차원 배열 이어야 합니다.
2. C# params 가변 매개변수 예제1 (특정한 데이터 타입 지정)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | //C# params example. BlockDMask. class _20190321_params1 { public static void Add(params int[] myList) { int sum = 0; //foreach example foreach (int elem in myList) { Console.Write(elem.ToString() + " "); sum += elem; } /* for loop example. for(int i=0; i<myList.Length; ++i) { Console.Write(myList[i].ToString() + " "); sum += myList[i]; } */ Console.WriteLine(); Console.WriteLine("params Length : " + myList.Length.ToString()); Console.WriteLine("params sum : " + sum.ToString()); Console.WriteLine(); } static void Main(string[] args) { Console.WriteLine("[1] 매개변수 여러개"); Add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Console.WriteLine("[2] 매개변수 없음"); Add(); } } | cs |
▲ params 예제1 결과
[1]을 보면 매개변수가 여러개일 때 1차원 배열 myList 에 들어가서 foreach, for 루프에서 잘 돌아가는걸 볼 수 있습니다.
[2]을 보면 매개변수를 넣지 않았을 때, lengh가 0이 나오는 것을 볼 수 있습니다.
3. C# params 가변 매개변수 예제2 (최상위 타입 object 지정)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | //C# params example. BlockDMask. class _20190321_params2 { public static void Mixed(params object[] myList) { Console.WriteLine("[Length] : " + myList.Length.ToString()); //------------------------------------------ Console.Write("[Print all] : "); foreach (object elem in myList) { //모든 요소 출력. Console.Write(elem.ToString() + " "); } Console.WriteLine(); //------------------------------------------ Console.Write("[string type] : "); for (int i=0; i<myList.Length; ++i) { Type t = myList[i].GetType(); if (t.Equals(typeof(string))) { //string 타입과 같은것만 출력 Console.Write(myList[i].ToString() + " "); } } Console.WriteLine(); //------------------------------------------ Console.Write("[int type] : "); foreach (object elem in myList) { Type t = elem.GetType(); if (t.Equals(typeof(int))) { //int 타입과 같은것만 출력 Console.Write(elem.ToString() + " "); } } Console.WriteLine(); } static void Main(string[] args) { Mixed(1, "BlockDMask", 2, 3, 4, "C#", 11, "Example"); } } | cs |
▲ params 예제2 결과
특정 데이터 타입을 보내기가 애매할때는 모든 클래스의 부모인 object 클래스 타입으로 넘기면 됩니다.
public static void Mixed(params object[] myList)
위와 같은 방식으로 넘기면됩니다.
감사합니다. 꾸준히 포스팅 되는 글이 보고싶으시다면, "구독" 부탁드립니다.