Share via


방법: 값 변경에 대해 프로시저 인수 보호(Visual Basic)

프로시저가 매개 변수를 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 배열은 참조 형식이므로 전달 메커니즘이 ByVal인 경우에도 increase는 해당 멤버를 변경할 수 있습니다.

두 번째 MsgBox 호출은 "교체 후(n): 11, 21, 31, 41"을 표시합니다. nByVal가 전달되므로 replace는 새 배열을 할당하여 호출 코드의 변수 n를 수정할 수 없습니다. replace가 새 배열 인스턴스 k를 만들고 로컬 변수 a에 할당하면 호출 코드에서 전달된 n에 대한 참조가 손실됩니다. a의 멤버를 변경하면 로컬 배열 k만 영향을 받습니다. 따라서 replace는 호출 코드에서 배열 n의 값을 증가시키지 않습니다.

코드 컴파일

Visual Basic의 기본값은 인수를 값으로 전달하는 것입니다. 그러나 선언된 모든 매개 변수와 함께 ByVal 또는 ByRef 키워드를 포함하는 것이 좋습니다. 이렇게 하면 코드를 더 쉽게 읽을 수 있습니다.

참고 항목