배열은 다양한 수의 매개 변수를 멤버로 전달하는 데 사용됩니다. C#와 같은 일부 언어는 가변 인수를 전달하는 데 사용되는 배열을 데코레이팅하는 키워드를 제공합니다. 키워드를 제공하지 않는 언어의 경우 ParamArrayAttribute 특성이 이 기능을 제공합니다. 키워드와 특성은 멤버 시그니처의 마지막 매개 변수에 영향을 줍니다. 이 매개 변수는 1차원 배열이어야 합니다.


다음 코드 예제에서는 다양한 수의 매개 변수를 사용하는 메서드를 정의하고 호출하는 방법을 보여 줍니다. DemonstrateVariableParameters 메서드에서 UseVariableParameters를 호출한 후 인수를 배열에 삽입합니다.

 

Visual Basic  

Public Shared Sub UseVariableParameters(ParamArray list() as  Integer)

     For  i as Integer = 0  to list.Length -1

        Console.WriteLine(list(i))

     Next i

     Console.WriteLine()

End Sub

 

Public Shared Sub DemonstrateVariableParameters()

 

    Manager.UseVariableParameters(1,2,3,4,5)

End Sub


C#  

public static void UseVariableParameters(params int[] list)

{

     for ( int i = 0 ; i < list.Length ; i++ )

     {

        Console.WriteLine(list[i]);

     }

     Console.WriteLine();

}

 

public static void DemonstrateVariableParameters()

{

    Manager.UseVariableParameters(1,2,3,4,5);

}

다음 지침은 매개 변수에 다양한 수의 배열을 사용해야 하는 경우를 알 수 있도록 도와줍니다.

최종 사용자가 적은 수의 요소를 전달하는 경우 params 키워드를 배열 매개 변수에 추가할 수 있습니다.

개발자가 일반 시나리오에서 많은 요소를 전달하는 경우, 개발자가 많은 수의 개체를 인라인으로 전달하므로 params 키워드가 그다지 유용하지 않습니다.

호출자가 일반적으로 배열에 이미 입력을 삽입한 경우 params 배열을 사용하지 않습니다.

예를 들어, 바이트 데이터는 일반적으로 바이트 배열에서 저장되고 조작됩니다. 개발자는 일반적으로 바이트 배열에 아직 저장되지 않은 개별 바이트에 대한 작업을 수행하므로 params 키워드를 바이트 배열 매개 변수에 추가하는 것으로 일반 시나리오를 설명할 수는 없습니다.

params 배열 매개 변수를 사용하는 멤버가 배열을 수정하는 경우 params 배열을 사용하지 않습니다.

CLR(공용 언어 런타임)에서 임시 배열 개체를 만들었을 수 있습니다. 메서드가 임시 배열을 수정하는 경우 호출자는 해당 수정 사항을 사용할 수 없습니다.

복잡한 오버로드에서는 params 키워드를 사용할 수 없지만 단순 오버로드에서는 사용할 수 있습니다.

params 배열이 모든 오버로드에 있지 않고 하나의 오버로드에만 있더라도 개발자는 이점을 얻을 수 있습니다.

매개 변수에서 params 키워드를 사용할 수 있도록 지시하지 않습니다.

즉, 가능한 경우 마지막으로 지정하는 매개 변수는 배열 매개 변수여야 합니다. 다음 코드 예제에서는 잘못된 매개 변수 순서를 보여 줍니다.


Visual Basic  

Overloads Public Function Add (i as Integer,j as Integer, numberBase as Int16) as Integer


C#  

public int Add (int i,int j, short numberBase)

 

Visual Basic  

Overloads Public Function Add (i as Integer, j as Integer, k as Integer, numberBase as int16) as Integer


C#  

public int Add (int i, int j, int k, short numberBase)

 

Visual Basic  

' Can't use params array.

Overloads Public Function Add (numbers() as Integer, numberBase as Int16) as Integer


C#  

// Can't use params array.
public int Add (int [] numbers, short numberBase)


이 매개 변수는 다음과 같은 순서로 변경해야 합니다.

 

Visual Basic  

Overloads Public Function Add (numberBase as Int16, i as Integer,j as Integer) as Integer


C#  

public int Add (short numberBase, int i,int j)

 

Visual Basic  

Overloads Public Function Add (numberBase as Int16, i as Integer, j as Integer, k as Integer) as Integer


C#  

public int Add (short numberBase, int i, int j, int k)

 

Visual Basic  

' Can use params array.

Overloads Public Function Add (numberBase as Int16, ParamArray numbers() as Integer) as Integer


C#  

// Can use params array.

public int Add (short numberBase, params int [] numbers)


성능이 매우 중요한 API에 적은 수의 인수를 사용하는 호출에 대한 특수 오버로드와 코드 경로를 제공할 수 있습니다.

이 지침을 따르면 적은 수의 인수를 사용하여 멤버를 호출할 때 배열이 만들어지지 않게 할 수 있습니다. 매개 변수 이름은 숫자 접미사가 뒤에 오는 배열 매개 변수의 단수 형식이어야 합니다. 다음 코드 예제에서는 이 지침을 따르는 멤버 시그니처를 보여 줍니다.

Visual Basic

Public Shared Sub WriteLine( format as String,  arg0 as Object, arg1 as Object, arg2 as Object )


C#  

public static void WriteLine(string format, object arg0, object arg1, object arg2)


null(Visual Basic의 경우 Nothing)을 params 배열 인수로 전달할 수 있습니다.

멤버는 null 배열을 확인한 후 처리해야 합니다.

줄임표라고도 하는 varargs 메서드는 사용하지 않습니다.

varargs 호출 규칙은 CLS를 준수하지 않으므로 public 멤버에서 사용해서는 안 되며 내부적으로만 사용할 수 있습니다.



Posted by woojja