'ByRef'에 해당되는 글 1

  1. 2008.10.13 [ASP] ByVal과 ByRef
카테고리 없음 | Posted by 낫기법필 2008. 10. 13. 09:30

[ASP] ByVal과 ByRef


ByVal - 함수에 넘겨준 매개 변수 값이 함수 안에서 변하더라도 매개 변수 값은 변하지 않는다.

ByRef - 함수에 넘겨준 매개 변수 값이 함수 안에서 변하면, 매개 변수 역시 값이 변한다.


Asp에서는 주로 생략해서 사용하고, 기본적으로 ByVal이 적용되는 걸 알 수 있다.

함수안에 변수인 testNum1, testNum2를 Num1, Num2로 바꿔도 같은 결과가 나온다.


<%
Dim Num1, Num2
Num1 = 10
Num2 = 20


Function Test_Return(ByVal tesNum1, ByRef tesNum2)

    Test_Return = tesNum1 + tesNum2
    tesNum1 = 30
    tesNum2 = 50

End Function


Response.Write Test_Return(Num1, Num2) &"<br>"
Response.Write Num1 &"<br>"
Response.Write Num2 &"<br>"
%>



ASP에서 사용되는 Visual Basic Procedure에서는 변수를 입력받을 때 다음 두가지 모드로 받을 수 있다.


ByRef : 호출된 프로시저가 호출 코드에서 내부 인수로 사용하는 변수의 값을 변경할 수 있도록 하는 방식으로 인수가 전달되도록 지정합니다.

ByVal : 호출된 프로시저나 속성은 호출 코드에서 내부 인수로 사용하는 변수의 값을 변경할 수 없도록 하는 방식으로 인수가 전달되도록 지정합니다.

음. 다음과 같이 쓰일 수 있다는 의미라고 보면 된다.


'// ■■ 레코드셋으로부터 Option Source를 구하는 프로시저 ■■
Function MakeOptionSourceFromRecSet(ByRef RecSet,Objnm,FirstValue)
 Dim ReturnSource
 Dim ArrV,ArrN
 If RecSet.EOF Then
  ReturnSource = ""
 Else
... 중략 ...
  RecSet.close
  Set RecSet = Nothing
  MakeOptionSourceFromRecSet = ReturnSource
End Function

위와 같은 소스에서 RecSet 레코드셋을 변수로 받았다면 ByRef로 받았을 때 프로시저 안에서 해당 레코드셋을 닫으면 실 소스에서 닫을 수 없다.

예를 들어


qrystr = "select code, name from sale"
set Res = Conn.Execute(qrystr)
optionSrc = MakeOptionSourceFromRecSet(Res, "code", "A")
Res.close
Set Res = nothing


위와 같이 하면 에러가 난다는 얘기다. Res라는 변수는 MakeOptionSourceFromRecSet라는 프로시저에 주소값을 직접 참조하는 형태로 넘어갔고, 해당 프로시저 내에서 이미 Nothing 시켜주었기 때문이다.

[출처] http://monorism.com/zbxe/?mid=board&listStyle=webzine&document_srl=5413