프로시저를 오버로드할 때 고려해야 할 사항
업데이트: 2007년 11월
프로시저를 오버로드할 때는 오버로드된 각 버전에 서로 다른 시그니처를 사용해야 합니다. 이는 일반적으로 각 버전에서 서로 다른 매개 변수 목록을 지정해야 한다는 것을 의미합니다. 자세한 내용은 프로시저 오버로딩에서 "서로 다른 시그니처"를 참조하십시오.
시그니처가 다르면 Sub 프로시저로 Function 프로시저를 오버로드할 수 있고 그 반대로 오버로드할 수도 있습니다. 하나는 반환 값을 가지고 다른 하나는 반환 값을 가지지 않으므로 이 두 오버로드는 다를 수 없습니다.
프로시저를 오버로드할 때와 같은 방식 및 제한 사항에 따라서 속성을 오버로드할 수 있습니다. 그러나 속성으로 프로시저를 오버로드하거나 프로시저로 속성을 오버로드할 수는 없습니다.
오버로드된 버전의 대체 방법
경우에 따라서는 오버로드된 버전을 대신하는 다른 방법을 사용할 수 있습니다. 특히 인수의 존재 여부가 선택적이거나 인수의 수가 가변적일 경우가 이에 해당합니다.
선택적 인수가 모든 언어에서 지원되는 것은 아니며 매개 변수 배열이 Visual Basic으로 제한되어 있다는 점에 주의합니다. 여러 다른 언어로 작성된 코드에서 호출되는 프로시저를 작성하는 경우에는 오버로드된 버전이 가장 뛰어난 유연성을 제공합니다.
오버로드 및 선택적 인수
호출 코드에서 하나 이상의 인수를 선택적으로 제공하거나 생략할 수 있는 경우 오버로드된 여러 버전을 정의하거나 선택적 매개 변수를 사용할 수 있습니다.
오버로드된 버전을 사용하는 경우
다음 경우에 일련의 오버로드된 버전을 정의해 볼 수 있습니다.
호출 코드에서 선택적 인수를 제공하는지 여부에 따라서 프로시저 코드의 논리가 크게 달라지는 경우
호출 코드에서 선택적 인수를 제공했는지 여부를 프로시저 코드가 안정적으로 테스트할 수 없는 경우. 예를 들어, 호출 코드에서 제공되지 않을 기본값에 대한 대체 값이 없는 경우가 이에 해당합니다.
선택적 매개 변수를 사용하는 경우
다음 경우에 하나 이상의 선택적 매개 변수를 사용할 수 있습니다.
- 호출 코드에서 선택적 인수를 제공하지 않는 경우에 매개 변수를 기본값으로 설정하는 작업만 필요한 경우. 이러한 경우 하나 이상의 Optional 매개 변수로 단일 버전을 정의하면 프로시저 코드는 덜 복잡해질 수 있습니다.
자세한 내용은 선택적 매개 변수를 참조하십시오.
오버로드 및 ParamArray
호출 코드에서 여러 가지 인수를 전달할 수 있는 경우 오버로드된 여러 버전을 정의하거나 매개 변수 배열을 사용할 수 있습니다.
오버로드된 버전을 사용하는 경우
다음 경우에 일련의 오버로드된 버전을 정의해 볼 수 있습니다.
호출 코드에서 항상 적은 수의 값만 매개 변수 배열에 전달한다는 것이 확실한 경우
호출 코드에서 전달하는 값 수에 따라 프로시저 코드의 논리가 크게 달라지는 경우
호출 코드에서 다른 데이터 형식의 값을 전달할 수 있는 경우
매개 변수 배열을 사용하는 경우
다음 경우에는 ParamArray 매개 변수를 사용하는 것이 좋습니다.
호출 코드에서 매개 변수 배열에 전달할 수 있는 값 수를 예측할 수 없으며 많은 수의 값이 매개 변수 배열에 전달될 수 있는 경우
호출 코드에서 전달하는 모든 값에서 프로시저 논리가 반복되어 본질적으로 모든 값에 대해 동일한 작업을 수행하는 경우
자세한 내용은 매개 변수 배열을 참조하십시오.
선택적 매개 변수의 암시적 오버로드
Optional(Visual Basic) 매개 변수가 있는 프로시저는 오버로드된 두 개의 프로시저(선택적 매개 변수가 있는 것과 없는 것)와 같습니다. 둘 중 하나에 해당하는 매개 변수 목록을 사용하는 이러한 프로시저는 오버로드할 수 없습니다. 다음은 이에 대한 선언입니다.
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)
오버로딩을 대체하는 관대한 형식의 프로그래밍
호출 코드에서 매개 변수에 서로 다른 데이터 형식을 전달하려는 경우 Visual Basic의 형식 없는 프로그래밍 방식을 대신 사용할 수 있습니다. Option Strict 문 또는 /optionstrict 컴파일러 옵션을 사용하여 형식 검사 스위치를 Off로 설정할 수 있습니다. 그런 다음에는 매개 변수의 데이터 형식을 선언할 필요가 없습니다. 그러나 오버로딩에 비해 무형식 프로그래밍은 다음과 같은 단점을 가지고 있습니다.
관대한 형식의 프로그래밍을 사용한 실행 코드는 효율성이 떨어집니다.
전달될 수 있는 모든 데이터 형식에 대해 프로시저를 테스트해야 합니다.
호출 코드에서 프로시저가 지원하지 않는 데이터 형식을 전달하는 경우 컴파일러에서 오류를 알리지 못합니다.
참고 항목
작업
방법: 매개 변수를 무제한으로 사용하는 프로시저 오버로드