프로시저를 오버로드할 때 고려해야 할 사항(Visual Basic)

프로시저를 오버로드하는 경우 오버로드된 각 버전에 대해 서로 다른 서명을 사용해야 합니다. 이는 일반적으로 각 버전이 서로 다른 매개 변수 목록을 지정해야 한다는 것을 의미합니다. 자세한 내용은 프로시저 오버로딩의 "다른 서명"을 참조하세요.

서로 다른 서명이 있는 경우 Sub 프로시저를 사용하여 Function 프로시저를 오버로드할 수 있으며, 그 반대의 경우도 마찬가지입니다. 두 오버로드는 하나는 반환 값이 있고 다른 하나는 그렇지 않다는 점에서만 다를 수 없습니다.

프로시저를 오버로드하는 것과 동일한 방식으로 동일한 제한 사항을 적용하여 속성을 오버로드할 수 있습니다. 그러나 프로시저를 속성으로 오버로드할 수 없으며 그 반대의 경우도 마찬가지입니다.

오버로드된 버전에 대한 대안

오버로드된 버전에 대한 대안이 있는 경우가 있습니다. 특히 인수의 존재 여부가 선택 사항이거나 해당 숫자가 변수인 경우입니다.

선택적 인수가 모든 언어에서 반드시 지원되는 것은 아니며 매개 변수 배열은 Visual Basic으로 제한됩니다. 여러 언어로 작성된 코드에서 호출될 가능성이 있는 프로시저를 작성하는 경우 오버로드된 버전이 가장 뛰어난 유연성을 제공합니다.

오버로드 및 선택적 인수

호출 코드에서 하나 이상의 인수를 선택적으로 제공하거나 생략할 수 있는 경우 오버로드된 여러 버전을 정의하거나 선택적 매개 변수를 사용할 수 있습니다.

오버로드된 버전을 사용하는 경우

다음과 같은 경우에는 일련의 오버로드된 버전을 정의하는 것이 좋습니다.

  • 프로시저 코드의 논리는 호출 코드가 선택적 인수를 제공하는지 여부에 따라 크게 다릅니다.

  • 프로시저 코드는 호출 코드에서 선택적 인수를 제공했는지 여부를 안정적으로 테스트할 수 없습니다. 예를 들어 호출 코드가 제공할 수 없는 기본값에 대한 가능한 후보가 없는 경우입니다.

선택적 매개 변수를 사용하는 경우

다음과 같은 경우에는 하나 이상의 선택적 매개 변수를 선호할 수 있습니다.

  • 호출 코드에서 선택적 인수를 제공하지 않는 경우 필요한 유일한 작업은 매개 변수를 기본값으로 설정하는 것입니다. 이러한 경우 하나 이상의 Optional 매개 변수를 사용하여 단일 버전을 정의하면 프로시저 코드가 덜 복잡해질 수 있습니다.

자세한 내용은 선택적 매개 변수를 참조하세요.

오버로드 및 ParamArrays

호출 코드가 가변 개수의 인수를 전달할 수 있는 경우 오버로드된 여러 버전을 정의하거나 매개 변수 배열을 사용할 수 있습니다.

오버로드된 버전을 사용하는 경우

다음과 같은 경우에는 일련의 오버로드된 버전을 정의하는 것이 좋습니다.

  • 호출 코드는 매개 변수 배열에 적은 수의 값을 전달하지 않습니다.

  • 프로시저 코드의 논리는 호출 코드가 전달하는 값 수에 따라 크게 다릅니다.

  • 호출 코드는 다양한 데이터 형식의 값을 전달할 수 있습니다.

매개 변수 배열을 사용하는 경우

다음과 같은 경우에는 ParamArray 매개 변수를 사용하는 것이 좋습니다.

  • 호출 코드가 매개 변수 배열에 전달할 수 있는 값 수를 예측할 수 없으며 많은 수일 수 있습니다.

  • 프로시저 논리는 호출 코드가 전달하는 모든 값을 반복하여 모든 값에 대해 기본적으로 동일한 작업을 수행합니다.

자세한 내용은 매개 변수 배열을 참조하세요.

선택적 매개 변수에 대한 암시적 오버로드

선택적 매개 변수가 있는 프로시저는 두 개의 오버로드된 프로시저와 같습니다. 하나는 선택적 매개 변수가 있고 다른 하나는 매개 변수가 없는 프로시저입니다. 이러한 프로시저 중 하나에 해당하는 매개 변수 목록을 사용하여 이러한 프로시저를 오버로드할 수 없습니다. 다음 선언에서는 이를 보여 줍니다.

Overloads Sub q(ByVal b As Byte, Optional ByVal j As Long = 6)
' The preceding definition is equivalent to the following two overloads.
' Overloads Sub q(ByVal b As Byte)
' Overloads Sub q(ByVal b As Byte, ByVal j As Long)
' Therefore, the following overload is not valid because the signature is already in use.
' Overloads Sub q(ByVal c As Byte, ByVal k As Long)
' The following overload uses a different signature and is valid.
Overloads Sub q(ByVal b As Byte, ByVal j As Long, ByVal s As Single)

둘 이상의 선택적 매개 변수가 있는 프로시저의 경우 이전 예제와 유사한 논리에 의해 도달된 암시적 오버로드 세트가 있습니다.

ParamArray 매개 변수에 대한 암시적 오버로드

컴파일러는 다음과 같이 ParamArray 매개 변수가 있는 프로시저를 호출 코드가 매개 변수 배열에 전달하는 것과 다른 무한 수의 오버로드를 갖는 것으로 간주합니다.

  • 호출 코드가 ParamArray에 인수를 제공하지 않는 경우의 오버로드

  • 호출 코드가 ParamArray 요소 형식의 1차원 배열을 제공하는 경우의 오버로드

  • 모든 양의 정수에 대해 호출 코드가 해당 수의 인수를 제공할 때 각 ParamArray 요소 형식에 대해 하나의 오버로드가 발생합니다.

다음 선언에서는 이러한 암시적 오버로드를 보여 줍니다.

Overloads Sub p(ByVal d As Date, ByVal ParamArray c() As Char)
' The preceding definition is equivalent to the following overloads.
' Overloads Sub p(ByVal d As Date)
' Overloads Sub p(ByVal d As Date, ByVal c() As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char, ByVal c2 As Char)
' And so on, with an additional Char argument in each successive overload.

매개 변수 배열에 대해 1차원 배열을 사용하는 매개 변수 목록을 사용하여 이러한 프로시저를 오버로드할 수 없습니다. 그러나 다른 암시적 오버로드의 서명을 사용할 수 있습니다. 다음 선언에서는 이를 보여 줍니다.

' The following overload is not valid because it takes an array for the parameter array.
' Overloads Sub p(ByVal x As Date, ByVal y() As Char)
' The following overload takes a single value for the parameter array and is valid.
Overloads Sub p(ByVal z As Date, ByVal w As Char)

오버로드 대안인 형식 없는 프로그래밍

호출 코드가 다른 데이터 형식을 매개 변수에 전달하도록 허용하려는 경우 대체 방식은 형식이 없는 프로그래밍입니다. Option Strict Statement 또는 -optionstrict 컴파일러 옵션을 사용하여 형식 검사 스위치를 Off로 설정할 수 있습니다. 그러면 매개 변수의 데이터 형식을 선언할 필요가 없습니다. 그러나 이 방식은 오버로드에 비해 다음과 같은 단점이 있습니다.

  • 형식 없는 프로그래밍은 덜 효율적인 실행 코드를 생성합니다.

  • 프로시저는 전달될 것으로 예상되는 모든 데이터 형식을 테스트해야 합니다.

  • 호출 코드가 프로시저에서 지원하지 않는 데이터 형식을 전달하는 경우 컴파일러는 오류를 알릴 수 없습니다.

참고 항목