티스토리 뷰

프로그래밍을 하다보면 Call By Reference(참조에 의한 호출), Call By Value(값에 의한 호출)라는 말을 많이 듣게 됩니다. 이는 함수에 값을 전달할 때 값을 복사하여 전달할 것인지, 자신의 값을 가진 메모리를 기반으로 전달할 것인지에 대한 차이입니다. (이해하기 어렵죠...)


프로그래밍을 할 때 어떠한 값을 임시적으로 저장하거나 그 값을 가져 올 때 PC는 메모리에서 그 값을 가져오게 됩니다. 실질적으로 변수를 하나 만들어서 변수에 값을 넣게 되면 변수는 메모리에 할당되어 할당된 메모리에 값을 저장하거나, 저장된 값을 할당된 메모리로 부터 가져오는 것이지요.


변수에 대해서 잘 모르시겠다면, 아래의 링크를 참조하세요



아래와 같이 4개의 변수를 만들었다고 가정을 해보겠습니다. 아래의 그림은 예시입니다. PC의 메모리에 변수에 대한 할당이 완벽히 아래와 동일하지 않겠지만 이런식으로 돌아간다는 정도로 참고로 보시기 바랍니다.


Dim number1 As Integer

Dim number2 As Integer

Dim number3 As Integer

Dim number4 As Integer


number1 ~ 4까지 Int형의 4개의 변수를 선언하여 실행을 하면 아래와 같이 메모리에 4개의 변수에 대한 할당 분이 생기게 됩니다. 아무런 값을 넣지 않았으니 Int형의 초기값인 0이 실질적인 값으로 들어가게 됩니다. 여기서 우리가 주목해야 하는 점은 변수를 할당하면 특정 주소에 값을 넣을 수 있게 만들어 진다는 점입니다. 즉 어느 주소에 어떠한 값이 들어가게 된다는 점을 확인하셔야 합니다.


그럼 변수를 선언하게 되면 PC입장에서는 변수와 관련된 주소와 실질적인 값에 대한 내용을 알고 있을 것입니다. 



number1 = 10

number2 = 20

number3 = 30

number4 = 40


변수 초기화 이후에 위와 같이 변수에 값을 넣는 코드를 구현한다고 하면, 아래와 같이 메모리에 할당된 상태가 변경이 될 것입니다.



주소는 변경되지 않았습니다. 값만 변경이 되었죠. 위에서 PC 는 변수가 선언되면 변수가 할당된 주소와 그 주소에 들어있는 값을 안다고 설명을 드렸습니다.


그럼 프로그래밍을 할 때, 특정 함수에 어떠한 변수를 전달을 하고자 하면 실질적으로 변수의 값을 전달할 수도 있을 것이고, 이 변수에 대한 주소도 전달을 할 수 있겠죠. 물론 사용자는 주소를 알고있지 않아도 됩니다. 사용자는 변수이름을 통해서 전달하면서 어떤때는 주소를 이용해서 써라, 어떨때는 값을 이용해서 써라 라고 프로그래밍 상에서 지시를 할 수 있기 때문입니다.


이러한 경우 사용하는 것이 바로 Call By Reference와 Call By Value입니다. Call By Reference는 사용자가 PC에 명령을 던질때(프로그래밍을 구현할 때) 변수에 대한 주소를 이용해라 라고 명령을 던지는 것입니다. Call By Value는 값을 이용해라라고 명령을 던지는 것이죠. 


대신 Call By Value인 경우 함수로 전달이 될 때 기존에 있던 값을 보존하기 위해서 이 값을 새로운 주소에 복사를 하여 전달을 하게 됩니다. 그 이유는 함수의 변수를 사용할 수 있는 범위는 함수시작부터 함수의 종료시점이기 때문에 기존의 변수 값에 영향을 미쳐서는 안되기 때문입니다. 


반면 Call By Reference인 경우 주소를 참조하여 사용하기 때문에 기존의 값의 변경에 영향을 미치게 됩니다. 


결론이 나왔습니다. (설명이 빈약했다면 댓글을 통해 질문을 하세요 ㅠㅠ 성심성의껏 답변드리겠습니다.)


Call By Value는 기존의 변수 선언을 통해 할당된 메모리내의 값을 변경하기를 원치않을 경우 새로운 복사본을 생성하여 전달하는 방식이고, Call By Reference는 기존의 변수 선언을 통해 할당된 메모리내의 값이 변경이 되어도 상관이 없는 알고리즘의 경우 함수에 값을 전달하는 방식입니다. 


그럼 엑셀에서는 어떻게 Call By Value와 Call By Reference를 사용할 까요? 엑셀에서는 ByRef와 ByValue라는 명령어를 통해서 사용을 할 수 있습니다. 엑셀에서는 기본적으로 Call By Reference 기반을 사용합니다. 따라서 전역변수를 선언하고 그 변수를 함수를 통해서 전달을 하여 함수 내에서 값을 변경하게 되면 이 함수의 값이 전역변수에도 영향을 미치게 됩니다. 


코드를 한번 작성해 보도록 하겠습니다.


Function CallByRef(ByRef 값 As Integer)

값 = 100

End Function


Function CallByValue(ByVal 값 As Integer)

값 = 1000

End Function


Sub PrintValues()


Dim value As Integer

value = 50

Cells.Range("A1").value = value


CallByValue 값:=value

Cells.Range("B1").value = value


CallByRef 값:=value

Cells.Range("C1").value = value


End Sub


CallByRef라는 함수는 ByRef 명령어를 CallByValue라는 함수는 ByValue 명령어를 이용하여 함수를 호출하고 있습니다. PrintValues 함수를 살펴보면 value 변수에 50을 먼저넣고 A1에 value의 값을 넣고, CallByValue 함수를 한번 호출한뒤 value의 값을 B1에, CallByRef 함수를 호출하여 value의 값을 C1에 넣고 있습니다. 


CallByValue함수에서는 전달된 값을 1000으로 변경하고, CallByRef함수는 전달된 값을 100으로 변경합니다. 결과를 살펴보면 아래와 같습니다. 



B1에는 value의 값이 변경되지 않고, C1은 값이 변경되었음을 확인할 수 있습니다. Call By Value시에는 전역 혹은 지역변수에 값이 영향을 미치지 않고, Call By Reference시에는 값이 변경되는 것을 위의 예를 통해서 확인이 가능합니다. 


이 글에서는 엑셀에서 ByRef(참조에 의한 호출), ByValue(값에 의한 호출) 사용법에 대해서 알아보았습니다.


이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.



댓글