본문 바로가기

Visual Basic.Net

ByRef와 ByVal 의 차이점, 그리고 어떨떄 써야할까?

내 타자연습기의 폼1에는 이런 api가 호출되있다.

 

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByRef lpszName As Any, ByVal hModule As Long, ByVal dwFlags As Long) As Long '밑의 두줄까지 소리재생 상수지정


private declare function은 이런 함수를 지정하겠다 라는게 딱 오는데 (lib은 lib파일 호출인데 라이브러리의 약자인것같다. 이 라이브러리를 사용한다는 말이겠지? alias는 그 라이브러리에서 이 함수를 쏙 빼와서 쓰겠다는 말이다. 지명할려는 함수와 꺼내쓸려는 함수의 이름이 같으면 생략된단다. 근데 지금은 다르니 생략을 못함다) 

ipszname나 hModule이나 dwFlags같은 경우는 함수 입력할때 뭐 써야될지 친히 알려주기 위해 쓰는 거같음

뒤의 as는 이런형식 아니면 뻐큐를 여러번 먹으란 소리같음


근데 ByRef인가 ByVal은 뭘까? 아이고 모르겠네


그래서 검색을 해보았습니다



Byref 이놈은 부르는 놈을 통째로 가져와버립니다. 아이고 무서운녀석. 그리고 이놈은 기본값이다.


ByVal은 정보만 뺴옵니다.


그러니까 이해가 쉽게 감성적인 아이튠즈 시스템으로말하자면


ByRef는 동기화가되고


ByVal은 안된다는 것입니다.


그러니까 ByRef는 함수호출후 그 변수에 이상한 짓을 하면 변해버리고 ByVal은 본체는 변하지 않는다는 겁니다


예제 코드


나는 타자연습기에서 콤보에따라 점수를올리고 싶다


그러면 점수를올리는 함수를 지정해야겠죠?


근데 콤보수만큼 그대로 점수를 올리면 재미없겠죠? 막 이상한 수식 집어넣어야 될것 같잖아요


private function 점수올리기(byval 콤보 as integer, byref 점수 as integer)

콤보=log콤보

점수 = 점수 + 콤보

점수올리기=점수

end function


이러면 점수는 점수+log콤보가 되어버리지만

콤보는 그냥 콤보로 남아있습니다. 왜나고요? byval로 불러서 갖고놀았기 떄문이죠!


제가 써놓고 혹시나 맞나 안맞나 테스트 해봤습니다. 저도 쪼렙이라서요

제가 실행한코드는 이것입니다.


Private Function 점수계산(ByVal 콤보 As Integer, ByRef 점수 As Integer)

콤보 = 콤보 * 10

점수 = 점수 + 콤보

점수계산 = 점수

End Function

Private Sub Command1_Click()

Dim 점수 As Integer

Dim 콤보 As Integer



콤보 = 10

점수 = 10


i = 점수계산(콤보, 점수)

MsgBox 콤보 & "  " & 점수

End Sub

i는 별 의미 없는 변수로 그냥 이 함수를 계산함으로써 점수의 값이 바뀌었는지 안바뀌었는지 보기위해서 막 만든겁니다


결과는요?


msgbox에 10 하고 110이 출력되었습니다


콤보가 저 함수 안에서 10이 곱해졌음에도 불구하고 10인상태를유지합니다.


그러나 점수는 확실히 점수+콤보(함수내에서 10이 곱해짐)이 됫습니다.

i는보나마나 110이겠죠.(안봤지만)


만약 함수 선언이 Private Function 점수계산(ByRef 콤보 As Integer, ByVal 점수 As Integer)였다면 당연히 100 10이 나왔을거라는건 여러분이라면 다 아시겠죠?


아싸 byref byval 정벅 ㅋ


ps. 설명하기 위해 함수를 저따구로해놨지만 사실 점수에 콤보의 10배를 더하는 함수는 존나 간단하다

private function점수에콤보의열배를더해버리자(콤보,점수)

점수=점수+콤보*10

end function


아이고 쉽다!


함 로그도 구현해볼까


log구하기(밑수,윗수) 이렇게 해서 하면 어떻게 식을 짜야될까

dim i as integer

do until int(윗수*100000000)=1 ' 밑수가 저만큼 자리밑까지 갈정도로구한다.

윗수=윗수/밑수

i=i+1

loop


상당히 그럴싸하지 않나? 함 돌려보았다.


라고 생각했지만, 이건 딱봐도 안된다.


밑수에 2 윗수에 8을집어넣으면 물론 3이 나오긴 하지만, 이래서야 이렇게 딱 떨어지는것 밖에 못구한다.


그래서 좀바꿧다


그리고 바꾼게 틩겼다 ㅅㅂ


이건 다음에 해봐야지


[출처] ByRef와 ByVal 의 차이점, 그리고 어떨떄 써야할까? 겸해서 api호출문 구조도 분석|작성자 ano

'Visual Basic.Net' 카테고리의 다른 글

Visual Basic에서 사용하는 데이터 형식  (2) 2012.11.25
BeginInvoke 와 Invoke  (0) 2012.11.23
InitializeComponent()  (0) 2012.11.23
선언시 As New 와 As 그리고 New  (0) 2012.11.23
(VB.NET)상속 (Inherits)을 알려 주마!!  (0) 2012.11.23