프로시저가 매개 변수를 ByRef로 선언하는 경우 Visual Basic은 프로시저 코드에 호출 코드의 인수를 기초로 하는 프로그래밍 요소에 대한 직접 참조를 제공합니다. 이렇게 하면 프로시저가 호출 코드의 인수를 기초로 하는 값을 변경할 수 있습니다. 경우에 따라 호출 코드는 이러한 변경으로부터 보호할 수 있습니다.
프로시저에서 해당 매개 변수 ByVal 을 선언하여 항상 인수를 변경으로부터 보호할 수 있습니다. 경우에 따라 지정된 인수를 변경할 수 있지만 다른 인수는 변경할 수 없도록 하려면 이를 선언 ByRef
하고 호출 코드에서 각 호출의 전달 메커니즘을 결정하도록 할 수 있습니다. 값으로 전달하기 위해 해당 인수를 괄호로 묶거나 참조로 전달하기 위해 괄호로 묶지 않음으로써 이 작업을 수행합니다. 자세한 내용은 방법: 인수를 값으로 전달하도록 강제 적용을 참조하세요.
예시
다음 예제에서는 배열 변수를 사용하고 해당 요소에서 작동하는 두 가지 프로시저를 보여 줍니다. 프로시저는 increase
각 요소에 하나만 추가합니다. 이 프로시저는 replace
매개 변수 a()
에 새 배열을 할당한 다음 각 요소에 배열을 추가합니다. 그러나 재할당은 호출 코드의 기본 배열 변수에 영향을 주지 않습니다.
Public Sub increase(ByVal a() As Long)
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Public Sub replace(ByVal a() As Long)
Dim k() As Long = {100, 200, 300}
a = k
For j As Integer = 0 To UBound(a)
a(j) = a(j) + 1
Next j
End Sub
Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " &
CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
첫 번째 MsgBox
호출은 "증가 후(n): 11, 21, 31, 41"을 표시합니다. 배열 n
은 참조 형식 increase
이므로 전달 메커니즘 ByVal
이 있더라도 해당 멤버를 변경할 수 있습니다.
두 번째 MsgBox
호출은 "After replace(n): 11, 21, 31, 41"을 표시합니다.
n
전달되므로 ByVal
replace
새 배열을 할당하여 호출 코드에서 변수 n
를 수정할 수 없습니다.
replace
새 배열 인스턴스 k
를 만들고 지역 변수a
에 할당하면 호출 코드에서 전달되는 참조 n
가 손실됩니다. 멤버 a
를 변경하면 로컬 배열 k
만 영향을 받습니다. 따라서 replace
호출 코드에서 배열 n
값을 증가시키지 않습니다.
코드 컴파일
Visual Basic의 기본값은 인수를 값으로 전달하는 것입니다. 그러나 ByVal 또는 ByRef 키워드를 선언된 모든 매개 변수에 포함하는 것이 좋은 프로그래밍 방법입니다. 이렇게 하면 코드를 더 쉽게 읽을 수 있습니다.
참고하십시오
.NET