최근 ATPCS(ARM Thumb Procedure Call Standard)에 대해서 공부하는 중에 Call-by-value, Call-by-reference에 대한 내용이 나와 관련 내용을 정리해보려구 한다.

 

필자는 pointer부터 공부했고 pointer에 대해 공부한 내용도 곧 업로드하도록 하겠다!

 

Call-by-value, Call-by-reference는 각각 값에 의한 호출, 참조에 의한 호출인데 사실 단어만 봐서는 이해가 잘 되지 않았다. 그래서 a값과 b값을 서로 Change하는 Swap code를 보면서 정리해보도록 하겠다.

 

Swap 1)

1) code

위와 같은 코드를 보자.
a=2, b=3이 초기값으로 저장되어 있고 두 값을 서로 Swap하기 위해서

a=b; b=a; 로 코드가 작성되어있다. 결과는 어떨까?

1) 결과

a, b 모두 동일하게 3이 나와버렸다. 이유는 다들 알것이라 생각하지만 설명해보면

8번 라인에서 a에 b의 초기값 3이 저장되고

9번 라인에서 b에 앞서 a에 업데이트된 값 3이 저장되면서 a, b 모두 3이 되어버렸다.

그렇다면 swap하려면 어떻게 해야할까?

 

Swap 2) 

2) code

위와 같이 tmp라는 임시저장소에 a값을 잠시 피신시켜놓으면 된다.

9번 라인에서 tmp에 a의 초기값 2가 저장되고

10번 라인에서 a에 b의 초기값 3이 저장된다.

11번 라인에서 b에 tmp에 저장되었던 2가 저장되면서

결과적으로 a=3, b=2로 Swap됨을 확인할 수 있다.

2) 결과

 

자, 위의 Swap Code는 모두 서론이었고 Swap도 이뤄지는 것을 봤으니

Call-by-value, Call-by-reference에 대한 설명은 지금부터다.


위에서 살펴본 Swap Code를 function으로 작성하여 main문 밖으로 꺼내보자.

 

1) Call-by-value

Call-by-value

보면 단순히 swap역할을 하던 8~11 라인의 code를 function으로 분리한 것 뿐이다.

분명 결과는 Swap했을 때와 동일할 것이다! 결과를 살펴보자. 

Call-by-value swap result

오잉? Swap이 이루어지지 않고 그대로 a=2, b=3으로 나왔다. function으로 밖으로 빼내기만 했을 뿐인데 말이다. 

그 이유는 바로 Call-by-value를 사용했기 때문이다. 

시간 순서대로 천천히 살펴보자.

 

(main)

12, 13 라인에서 a=2, b=3으로 초기화가 되었다.

그리고 15 라인에서 swap function으로 들어간다.

 

(swap)

3 라인 선언부에서 x=2, y=3을 배정받는다. (Call-by-value)

4 라인에서 tmp에는 2가 저장되고

5 라인에서 x에는 3이 저장된다.

6 라인에서는 y에 tmp의 값 2가 저장된다. 

 

(main)

17라인에서 a=2,b=3를 printf로 출력한다.

a, b, x, y의 값 변화

즉, function에서 값에 의한 호출(Call-by-value)을 했기 때문에 function 안에서 x,y만 swap이 되었고 a, b는 변함이 없었던 것이다. 

 

그렇담.. 이 방법으로 어떻게 Swap을 구현할까? 당근 방법은 Call-by-reference이다. 

 

2) Call-by-reference

Call-by-reference

a, b, x, y가 주소값과 포인터로 바뀐 것이 보인다. 

이 또한 시간 순서대로 살펴보자.

 

(main)

마찬가지로 12, 13 라인에서 a=2, b=3으로 초기화가 되었다.

그리고 15 라인에서 swap function으로 a의 주소값(ex.100), b의 주소값(ex.200)이 들어간다.

 

(swap)

3 라인 선언부에서 포인터 x에 a의 주소값(ex.100), 포인터 y에 b의 주소값(ex.200)이 들어간다. (Call-by-reference)

4 라인에서 tmp에는 포인터 x가 가리키는 변수의 값(a)인 2가 저장되고

5 라인에서 포인터 x가 가리키는 변수의 값(a)에는 포인터 y가 가리키는 변수의 값(b) 3이 저장된다.

6 라인에서는 포인터 y가 가리키는 변수의 값(b)에 tmp의 값 2가 저장된다. 

 

(main)

17라인에서 a=3, b=2를 printf로 출력한다.

a, b, x, y값 변화

실제 결과를 살펴보자. 

Call-by-reference result

pointer와 Call-by-reference를 사용해 swap이 잘 이루어진 것을 볼 수 있다. 

 

해당 내용은 여기까지이다. 
쉽게 써보려고 노력했지만 사실 쉬운 내용은 아니라 스스로도 아직은 익숙치 않은 것 같다.

S/W공부도 틈틈히 해야겠구만..!

공부하다가 기록할만한 내용이 있다면 다른 포스트로 돌아오도록 하겠다! 안녕

 

 

 

출처 : https://www.youtube.com/watch?v=Bpu5YiAgETo&t=564 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기