C#,Delphi,Oracle,MSSQL 개발자블로그

Call by value와 Call by reference 본문

Programming/C#

Call by value와 Call by reference

19760323 2017. 3. 12. 19:18

call by value 와 call by reference의 차이점은
swap 함수의 구현으로써
설명 할 수 있다!!

'Call by value'닫기

<Call by value>

1. Call by value :
우리말로하면 바로 "값에 의한 호출"이란 뜻으로, 어떤 함수를 호출할때에 전달인자로 그 데이터 값 자체를 전달하는 호출 방법이다.

2. swap함수의 구현
위와 같은 소스를 실행시켜보았을때,  swap함수대로 a와 b의 값이 제대로 바뀌지 않은채로
출력하는걸 볼수 있다.
함수 호출시 ===> swap(a,b);    
(소스의 빨간 숫자들은 순서를 표현하기 위해 임의로 붙여놓은것, 소스코드와는 상관없다)


3. 스택(Stack)으로 나타내기

붙인 번호순서대로
메모리 상황을 스택으로 그려보면 다음과 같다


① 변수 a와 b가 선언되고, 그 값으로 3과 5이 들어간다. (a부터 들어가고, b가 올라감)

② swap 함수가 불려지면 함수 정의 부분으로 가되, 전달인수로는 a=3, b=5 가 스택이 순서로 들어간다.
   (a와 b의 데이터 자체를 전달인자로 호출)
  그리고 새로 선언된 int형 tmp 변수가 선언된다.

③ 변수 tmp에는 현재 a의 값이 3이 입력되고, 그다음 변수 a에는 현재 변수 b의 값인 5이 입력된다.

④ 변수 b에는 현재 tmp의 값인 3이 입력된다.

swap함수의 동작이 모두 끝나고 나면 swap 함수에서 썼던 변수들은(붉은색 부분)
스택에서 모두 나가 사라진다.
   pintf 실행시 결국 a와 b값은 그대로 3과 5가 출력된다.

'Call by value'닫기


'Call by reference' 닫기


<Call by reference>

1. Call by reference : 
       우리말로 "참조에 의한 호출"라는 뜻으로, 어떤 특정한 데이터 값이 아닌 그값에 대한 정보를 전달하는 호출방법이다.

2.swap 함수의 구현

위와같이 구현하여 실행시켰을때,  a와 b의 변수값이 제대로 바뀐것을 볼 수 있다.
함수호출시 ===>
swap(&a, &b)
                        변수  a와 b의 주소값을 인자로 전달함!!!
(소스의 빨간 숫자들은 순서를 표현하기 위해 임의로 붙여놓은것, 소스코드와는 상관없다)

3. 스택(Stack)으로 나타내기

소스코드에 붙인 번호순서대로
메모리 상황을 스택으로 그려보면 다음과 같다

① 변수 a와 b가 선언되고, 그 값으로 3과 5이 들어간다.

(변수 a가 저장된 메모리의 주소값이 100, b의 메모리 주소값은 104라 가정)

③ swap 함수가 불려지면 함수 정의 부분으로 가되, 전달인수로는 a의 주소값 100, b의 주소값 104.
   (전달인수의 형식은 주소값, 포인터형식 *a, *b)
   그리고 새로 선언된 int형 tmp 변수가 선언된다.

④ 변수 tmp에는 *a가 가리키고있는 곳(100번지)의 ,즉 3이 들어간다.
   그다음 *a가 가리키고있는 곳(100번지)의 *b가 가리키고있는 곳(104번지)의 과 같게된다.
   즉 tmp=3 그리고 a=5 가된다.

⑤  *b가 가리키고있는 곳(104번지)의 은 tmp의 값, 즉 3이 된다. (b=3)

swap함수의 동작이 모두 끝나고 나면 swap 함수에서 썼던 변수들은(붉은색 부분)
스택에서 모두 나가 사라진다.
   pintf 실행시 a와 b의 값이 처음값에서 뒤바뀌어 출력된다!


출처 : http://choieun.tistory.com/


Comments