Visual Basic 6.0 사용자를 위한 매개 변수 전달 메커니즘
업데이트: 2007년 11월
Visual Basic 2008에서는 인수가 프로시저에 전달되는 방법에 영향을 주는 몇 가지 사항이 변경되었습니다.
기본 전달 메커니즘
Visual Basic 6.0
Visual Basic 6.0에서는 프로시저 매개 변수에 대해 ByVal이나 ByRef를 지정하지 않으면 ByRef가 기본 전달 메커니즘으로 지정됩니다. 이렇게 되면 프로시저에 전달된 변수가 호출 프로그램에서 수정될 수 있습니다.
변수가 수정되면 문제가 발생할 수 있습니다. 다음 예제에서는 기본 전달 메커니즘이 ByRef이고, elapsedSeconds의 값이 minutesPastHour에 의해 변경되고, elapsedSeconds가 MsgBox에 잘못 표시됩니다.
Function minutesPastHour(seconds As Integer) As Integer
Dim hours As Integer = seconds \ 3600
seconds = seconds Mod 3600
Return seconds \ 60
End Function
Sub showSecondsAndMinutes()
Dim elapsedSeconds, extraMinutes As Integer
elapsedSeconds = CInt(Timer()) ' Integer seconds since midnight.
extraMinutes = minutesPastHour(elapsedSeconds)
MsgBox "Total seconds: " & elapsedSeconds & _
"; minutes past hour: " & extraMinutes
End Sub
ByRef 인수를 전달하면 호출 프로그램이 해당 인수를 변경할 수 있으므로 예상치 못한 동작이 발생할 수 있습니다. 또한 해당 프로시저가 다른 프로시저를 호출한 다음 ByRef 인수를 전달하면 원래 변수가 변경될 가능성이 높아집니다.
Visual Basic 2008
Visual Basic 2008에서는 프로시저를 선언할 때 모든 매개 변수의 기본 전달 메커니즘이 ByVal입니다. 이렇게 되면 인수가 수정되지 않습니다. 이전 예제의 선언은 다음과 같이 다시 쓸 수 있습니다.
Function MinutesPastHour(ByVal Seconds As Integer) As Integer
seconds를 값으로 전달하면 프로시저가 호출 프로그램에서 해당 변수에 액세스할 수 없으므로 앞에서 설명한 문제를 방지할 수 있습니다.
ByVal이 기본 메커니즘이지만 모든 매개 변수에 대해 ByVal을 명시적으로 지정하면 코드가 명확해지고 가독성이 향상됩니다.
ByRef 속성 인수
Visual Basic 6.0
Visual Basic 6.0에서 ByRef 인수로 프로시저에 전달된 속성은 프로시저 내부로는 복사되지만 외부로는 복사되지 않습니다. 따라서 ByRef 인수가 전달된 경우에도 이러한 속성 인수에 대한 수정 사항이 호출 프로그램의 원래 속성에 다시 반영되지 않습니다.
Visual Basic 2008
Visual Basic 2008에서 ByRef로 전달된 속성 인수는 프로시저 내부 및 외부로 모두 복사됩니다. 다음 예제에서는 프로시저로 속성을 변경할 수 있는 방법을 보여 줍니다.
Sub Reduce(ByRef Height As Single)
' ... ... ... ... ... ... ... ' Code to modify Height argument.
End Sub
Dim Sq As Square = New Square ' Square has property Side of type Single.
Reduce(Sq.Side) ' Side is changed when Reduce returns.
프로시저에서 속성 인수를 수정하면 원래 속성의 값이 호출 프로그램에서 즉시 변경되지 않습니다. 대신 프로시저가 복귀될 때 해당 내용이 복사됩니다.
ParamArray 인수
Visual Basic 6.0
Visual Basic 6.0에서는 프로시저의 인수 끝에 ParamArray 키워드를 지정하여 Variant 인수의 배열을 허용할 수 있습니다. 이러한 인수의 전달 메커니즘은 선언할 수 없습니다. 인수는 항상 ByRef로 전달됩니다.
Visual Basic 2008
Visual Basic 2008에서는 ParamArray 인수가 항상 ByVal로 전달됩니다. 배열의 인수는 모두 ParamArray 인수의 데이터 형식이어야 합니다.
참고 항목
개념
Visual Basic 6.0 사용자를 위한 프로시저 선언
Visual Basic 6.0 사용자를 위한 프로시저 호출 시퀀스