C#,Delphi,Oracle,MSSQL 개발자블로그
Call by value와 Call by reference 본문
call by value 와 call by reference의 차이점은
swap 함수의 구현으로써
설명 할 수 있다!!
'Call by value'닫기
<Call by value>
1. 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가 출력된다.
출력하는걸 볼수 있다.
함수 호출시 ===> 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/
'Programming > C#' 카테고리의 다른 글
C# String 정리.(substring, split, indexof) (0) | 2017.04.14 |
---|---|
C# 텍스트 안에 ",\ 등 쓰는 법. (0) | 2017.03.12 |
C# 다른폼에서 폼 제어하기 (0) | 2017.03.12 |
C# OpenFileDialog 에서 경로 가져오기 (0) | 2017.03.12 |
C# 원하는 길이로 좌측/우측 정렬시킨후 나머지 공간을 다른 문자로 채우기(pad) (0) | 2017.03.12 |
Comments