하루의 쉼터

[비교]Call by Value와 Call by Address,Reference 차이 (값 전달과 주소전달 차이) 본문

프로그래밍/C언어

[비교]Call by Value와 Call by Address,Reference 차이 (값 전달과 주소전달 차이)

Changun An 2019. 1. 14. 09:05
반응형

l  Call by Value(값 전달)

l  Call by Address, Reference(주소 전달)


프로그래머가 되기 위해 준비하는 사람들이라면 많이 들어 봤을 것이다.

Call by Value와 Address,Reference.


Value의 사전적 의미는 가치 또는 값 이라는 뜻을 가지고 있다.

Address의 사전적 의미는 주소라는 뜻을 가지고 있다.

Reference의 사전적 의미는 참고 또는 참조라는 뜻을 가지고 있다.


우리는 C를 가지고 함수를 통하여 이러한 것들이 무엇을 뜻하는지 살펴 보자.

Address와 Reference는 같은 개념으로 볼 것이다. 

C에선 Reference를 유사하게 표현한 것이 Address라고 보면 된다.


참조 : 

2019/01/10 - [프로그래밍/C언어] - [기초] 포인터


l  Call by Value

값에 의한 호출, 함수에 매개 변수의 내용물을 전달 하여 복사해서 사용 하는 방식이다.

쉽게 설명 하자면 아래의 예시를 보자.

무민이는 곰돌이의 눈이 사라져 공장에 문의 하기로 했다.

이때 무민이가 가지고 있는 곰돌이의 인형은 이름은 민수고 제품 번호는 1000A라 하자.

공장에선 전화를 받고 같은 모델의 인형을 꺼낸다. 이 인형의 이름은 민수가 아니고

제품 번호도 다르다. 공장에서는 민수에게 곰돌이의 눈을 보내주었다.


이때 무민이는 사용자, 곰돌이는 변수, 공장은 함수, 

문의하는 과정이 Call by Value, 곰돌이 눈을 보내주는 것이 리턴 값으로 볼 수 있다.


아래는 간단한 예시이다. 결과 값이 무엇일까 생각해보자.


6번째 printf 함수에서는 100이 나올 것이다.

그럼 8번째 prtinf 함수에서는 무슨 결과 값을 도출할까?

a의 10을 대입하였으니 10이 나올까?

답은 100이 나왔다. 

이유는 바로 main문 안에 있는 a변수를 매개변수로 직접 보낸 것이 아닌

함수에서 복사하여 사용 했기 때문에 실제로 main문에 있는 a의 값은 전혀 변하지 않았다.


그렇다면 함수 안에 있는 a=10은 어떻게 되는 것일까? 

답은 함수가 종료되면서 소멸된다. 


이와 연관하여 지역 변수, 전역변수에 대해 생각해보는 것도 좋다.



l  Call by Address,Reference

주소에 의한 호출, 주소를 참조해서 호출 하는 방식이다. 

위의 있던 예제를 가지고 쉽게 접근하여 보자.

위와 같이 무민이는 곰인형의 눈이 사라져 공장에 문의하기로 했다.

이때 무민이는 위와는 다르게 곰인형을 직접 공장에 보내었다.

공장은 민수를 가지고 인형에 눈을 부착하였다.


다른점은 바로 직접 인형을 보냈다는 것. 

즉, 유사한 제품이 아니라 문제가 있는 혹은 해결하고자 하는 것을 직접 전달한 것이다.


아래의 코드를 보며 결과를 유추해보자.



6번째 a는 100을 도출할 것이다.

그렇다면 8번째 printf 함수는 어떠한 결과 값을 낼까?

10을 도출 해낼 것이다.

함수에게 주소를 전달하였고 직접 수정을 하였으니 moomin이라는 함수가 종료되어도

메모리 상에 있던 a는 10을 유지 할 것이다.



반응형

'프로그래밍 > C언어' 카테고리의 다른 글

[Algorithm] Linked List_연결리스트  (0) 2020.12.08
[Algorithm] 동적메모리(Heap)  (0) 2020.12.08
[비교]배열포인터와 포인터배열  (0) 2019.01.11
[기초] 포인터  (0) 2019.01.10
[기초] while문 - 반복문  (0) 2019.01.07
Comments