<개인공부>/[C#]

[C#] params 가변인자 매개변수에 대해서.

BlockDMask 2019. 3. 21. 01:22
반응형

안녕하세요. 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(12345678910);
 
        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"234"C#"11"Example");
    }
}
cs


▲ params 예제2 결과

특정 데이터 타입을 보내기가 애매할때는 모든 클래스의 부모인 object 클래스 타입으로 넘기면 됩니다.

public static void Mixed(params object[] myList)

위와 같은 방식으로 넘기면됩니다. 



감사합니다. 꾸준히 포스팅 되는 글이 보고싶으시다면, "구독" 부탁드립니다.

반응형