C/C++ 언어 코딩 복습 - 호출 방법 1 (Call by value, call by reference)
-
함수들을 이용할 때 데이터들을 넘겨주는 방식에 대해 알아보겠습니다. 대표적인 방식으로는 값에 의한 호출 (call by value), 참조에 의한 호출 (call by reference), 주소에 의한 호출 (call by address) 이 있습니다.
값에 의한 호출 (call by value) :
- 이전까지 주로 사용하던 방식으로 함수를 호출할 때 변수 자체를 넘기는 것이 아니라 변수에 저장된 값만을 값만 넘겨주는 방식입니다. 간단한 예를 살펴보겠습니다.
예제코드
#include <iostream>
using namespace std;
void TcallV(int);
int main() {
int a ;
a = 1;
TcallV(a);
cout <<" In main function : "<< " a =
" << a << ", address of a = "<< &a
<< endl;
return 0;
}
void TcallV(int a){
a += 1;
cout <<" Call by value : "<< " a =
" << a << ", address of a = "<< &a
<< endl;
}
- 정수형 인자 하나를 갖고 반환값이 없는 TcallV 함수를 선언하였습니다. 이 함수에서는 넘겨받은 정수형 인자에 1을 더해서 (a += 1;) 다시 대입하도록 하였습니다. 그리고 'a' 의 값과 주소값을 출력 하도록 하였습니다.
- main 함수에서 정수형 변수 'a' 를 선언하고 1을 대입하였습니다. 그리고 TcallV 함수의 인자로 'a' 를 주었습니다. 그 다음 메인 함수의 'a' 의 값과 주소값을 출력하도록 하였습니다.
실행결과
-
TcallV 함수의 결과로 " Call by
value : a = 2"
라는 결과가 출력되었습니다. main 함수의 변수 'a' 의 값 1을 넘겨받아 TcallV 함수의 변수 'a' 에 1을 대입하고 'a +=1;' 이라는 문장을 수행해 결과로 2 라는 값을 출력하였습니다. TcallV 함수의 변수 'a' 의 주소값은 "0x7ffd01c5d8bc
" 라고 출력 되었습니다.
-
main 함수에서 출력된 변수 'a' 의 값은 1 이라는 결과를 얻었습니다. 즉, main 함수의 변수 'a' 와 TcallV 함수의 변수 'a' 는 서로 다른 독립적인 변수임을 알 수 있습니다. 또한 두 변수의 주소값을 확인해보면 서로 다름을 알 수 있습니다.
참조에 의한 호출 (call by reference) :
-
같은 변수를 다른 이름 (별칭) 으로 사용하고 싶을 때 사용되는 방법입니다. 사용법은 다음과 같습니다.
사용법
int
a = 1;
int
&b = a;
-
정수형 변수 a 를 선언하고 1 을 대입합니다.
reference 변수 b
(&b) 를 선언하고 앞에서 선언한 a 를 지정합니다. 앞으로 a 를 b 라는 이름으로도 사용하겠다는 의미 입니다.
-
간단한 예로 살펴보겠습니다.
#include
<iostream>
using
namespace std;
void
TcallR(int &);
int
main() {
int a ;
a = 1;
TcallR(a);
cout <<" In main function : "<< " a =
" << a << ", address of a = "<< &a
<< endl;
return 0;
}
void
TcallR(int &b){
b += 1;
cout <<" Call by reference :
"<< " b = " << b << ", address
of b = "<< &b << endl;
}
-
TcallR(int &b) 함수
정의부분에서 전달받는 인자의 형태를
&b 로 지정하였습니다. 즉, 전달받는 매개변수를 다른 이름으로 사용하겠다는 것입니다. 결과를 확인해보겠습니다.
실행결과
-
TcallR 함수의 'b' 와 main
함수의 'a' 둘다 2 의 값이 대입되어 있고 출력되는 것을 볼 수 있습니다. 또한 주소값이 동일함을 알 수 있습니다.
-
즉, TcallR
함수 내에서 main 함수의
변수 'a' 를
변수 'b' 의 이름으로 사용하고 있다는 것입니다.
No comments:
Post a Comment