방법: 프로시저 인수의 값 변경(Visual Basic)
프로시저를 호출할 때 제공하는 각 인수는 프로시저에 정의된 매개 변수 중 하나에 해당합니다. 경우에 따라 프로시저 코드는 호출 코드의 인수를 기초로 하는 값을 변경할 수 있습니다. 다른 경우에는 프로시저에서 인수의 로컬 복사본만 변경할 수 있습니다.
프로시저를 호출할 때 Visual Basic은 ByVal로 전달되는 모든 인수의 로컬 복사본을 만듭니다. ByRef로 전달된 각 인수에 대해 Visual Basic은 프로시저 코드에 호출 코드의 인수를 기초로 하는 프로그래밍 요소에 대한 직접 참조를 제공합니다.
호출 코드의 기본 요소가 수정 가능한 요소이고 인수가 ByRef
(으)로 전달되는 경우 프로시저 코드는 직접 참조를 사용하여 호출 코드에서 요소의 값을 변경할 수 있습니다.
기본 값 변경
호출 코드에서 프로시저 인수의 기본 값을 변경하려면
프로시저 선언에서 인수에 해당하는 매개 변수에 대해 ByRef를 지정합니다.
호출 코드에서 수정 가능한 프로그래밍 요소를 인수로 전달합니다.
호출 코드에서 인수를 인수 목록의 괄호로 묶지 마세요.
프로시저 코드에서 매개 변수 이름을 사용하여 호출 코드의 기본 요소에 값을 할당합니다.
데모를 보려면 아래 예제를 참조하세요.
로컬 복사본 변경
호출 코드의 기본 요소가 수정할 수 없는 요소이거나 인수가 ByVal
(으)로 전달되는 경우 프로시저는 호출 코드에서 해당 값을 변경할 수 없습니다. 그러나 프로시저는 이러한 인수의 로컬 복사본을 변경할 수 있습니다.
프로시저 코드에서 프로시저 인수의 복사본을 변경하려면
프로시저 선언에서 인수에 해당하는 매개 변수에 ByVal을 지정합니다.
또는
호출 코드에서 인수를 인수 목록의 괄호로 묶습니다. 이렇게 하면 해당 매개 변수가
ByRef
(을)를 지정하는 경우에도 Visual Basic에서 인수를 값으로 전달합니다.프로시저 코드에서 매개 변수 이름을 사용하여 인수의 로컬 복사본에 값을 할당합니다. 호출 코드의 기본 값은 변경되지 않습니다.
예시
다음 예제에서는 배열 변수를 사용하고 해당 요소에서 작동하는 두 가지 프로시저를 보여 줍니다. 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(ByRef 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
배열은 참조 형식이므로 전달 메커니즘이 ByVal
인 경우에도 replace
(은)는 해당 멤버를 변경할 수 있습니다.
두 번째 MsgBox
호출은 "교체 후(n): 101, 201, 301"을 표시합니다. n
(이)가 ByRef
에 전달되므로 replace
호출 코드의 변수 n
(을)를 수정하고 새 배열을 할당할 수 있습니다. n
(은)는 참조 형식이므로 replace
멤버를 변경할 수도 있습니다.
프로시저가 호출 코드에서 변수 자체를 수정하지 못하도록 할 수 있습니다. 방법: 값 변경에 대비해 프로시저 인수 보호.
코드 컴파일
참조로 변수를 전달하는 경우 ByRef
키워드를 사용하여 이 메커니즘을 지정해야 합니다.
Visual Basic의 기본값은 인수를 값으로 전달하는 것입니다. 그러나 선언된 모든 매개 변수와 함께 ByVal 또는 ByRef 키워드를 포함하는 것이 좋습니다. 이렇게 하면 코드를 더 쉽게 읽을 수 있습니다.
.NET Framework 보안
프로시저가 호출 코드의 인수를 기본으로 하는 값을 변경할 수 있는 잠재적인 위험이 항상 있습니다. 이 값이 변경될 것으로 예상하는지 확인하고 사용하기 전에 유효성을 검사하도록 준비해야 합니다.
참고 항목
.NET