방법: 인수가 값으로 전달되도록 설정(Visual Basic)
프로시저 선언에 따라 전달 메커니즘이 결정됩니다. 매개 변수가 ByRef(Visual Basic)로 선언되면 Visual Basic에서는 해당 인수가 참조로 전달된다고 예상합니다. 이렇게 하면 프로시저가 호출 코드에서 내부 인수로 사용하는 프로그래밍 요소의 값을 변경할 수 있습니다. 이러한 변경으로부터 내부 요소를 보호하려면 인수 이름을 괄호로 묶어 프로시저 호출에서 ByRef 전달 메커니즘을 재정의할 수 있습니다. 호출에서 인수 목록을 묶는 괄호에 이러한 괄호가 추가됩니다.
호출 코드에서 ByVal(Visual Basic) 메커니즘을 재정의할 수는 없습니다.
인수가 값으로 전달되게 설정하려면
해당 매개 변수가 프로시저에서 ByVal로 선언된 경우 어떠한 추가 단계도 수행할 필요가 없습니다. 이미 Visual Basic에서는 인수가 값으로 전달되는 것으로 간주됩니다.
해당 매개 변수가 프로시저에서 ByRef로 선언된 경우 프로시저 호출에서 인수를 괄호로 묶습니다.
예제
다음 예제에서는 ByRef 매개 변수 선언을 재정의합니다. ByVal로 처리하는 호출에서는 중첩 괄호를 사용함을 유의하십시오.
Sub setNewString(ByRef inString As String)
inString = "This is a new value for the inString argument."
MsgBox(inString)
End Sub
Dim str As String = "Cannot be replaced if passed ByVal"
' The following call passes str ByVal even though it is declared ByRef.
Call setNewString((str))
' The parentheses around str protect it from change.
MsgBox(str)
' The following call allows str to be passed ByRef as declared.
Call setNewString(str)
' Variable str is not protected from change.
MsgBox(str)
인수 목록 내에서 str를 추가 괄호로 묶으면 setNewString 프로시저는 호출 코드에서 해당 값을 변경할 수 없으며 MsgBox에는 "Cannot be replaced if passed ByVal"이 표시됩니다. str를 추가 괄호로 묶지 않으면 프로시저가 해당 값을 변경할 수 있으며 MsgBox에는 "This is a new value for the inString argument."가 표시됩니다.
코드 컴파일
변수를 참조로 전달할 경우 ByRef 키워드를 사용하여 이 메커니즘을 지정해야 합니다.
Visual Basic에서는 기본적으로 인수를 값으로 전달합니다. 하지만 모든 선언된 매개 변수에 ByVal(Visual Basic) 또는 ByRef(Visual Basic) 키워드를 사용하는 것이 바람직한 프로그래밍 습관입니다. 그러면 코드를 더 쉽게 읽을 수 있습니다.
강력한 프로그래밍
프로시저에서 ByRef(Visual Basic) 매개 변수를 선언한 경우 호출 코드의 내부 요소를 변경할 수 있는지 여부에 따라 코드가 올바르게 실행되는지 결정됩니다. 인수를 괄호로 묶어 호출 코드에서 이 호출 메커니즘을 재정의하거나 수정할 수 없는 인수가 전달될 경우 프로시저는 내부 요소를 변경할 수 없습니다. 이로 인해서 호출 코드에서 예기치 않은 결과가 발생할 수 있습니다.
보안
호출 코드에서 내부 인수로 사용하는 값을 프로시저에서 변경하도록 허용하는 것은 항상 잠재적인 위험을 갖고 있습니다. 따라서 이 값이 변경될 것을 예상해야 하고 값을 사용하기 전에 유효성을 검사할 수 있도록 준비해야 합니다.
참고 항목
작업
방법: 프로시저 인수의 값 변경(Visual Basic)
방법: 값 변경에 대해 프로시저 인수 보호(Visual Basic)
개념
수정할 수 있는 인수와 수정할 수 없는 인수 사이의 차이점(Visual Basic)
인수를 값으로 전달할 때와 참조로 전달할 때의 차이점(Visual Basic)