C언어와 마찬가지로 C++에서도 함수에 매개변수를 전달할 때 Call by Value 와 Call by Reference 두 가지 방법이 있는데, C++은 Call by Reference 에서 포인터를 이용한 방법과 레퍼런스를 이용한 방법 두 가지 방법으로 분류된다. C++ 의 Call by Reference 방법에 대해 알아보자.
1. Call by value
Call by Value는 C언어와 마찬가지로 값을 전달할 때 값을 복사하여 전달하는 방식이다. 따라서 원래 변수의 있는 데이터는 변경되지 않는다. 이것을 Call By Value라고 한다.
#include <iostream>
using std::cout;
using std::endl;
void fun(int a, int b) {
a++;
cout << "a 값 : " << a << endl;
b++;
cout << "b 값 : " << b << endl;
}
int main() {
int a = 10;
int b = 10;
fun(a, b);
cout <<"a and b value = " << a << ", " << b << endl;
return 0;
}
***** result *****
a 값 : 11
b 값 : 11
a and b value = 10, 10
2. 포인터를 이용한 Call By Reference
C언어의 포인터를 이용한 Call By Reference 와 같다. 함수 외부에 선언된 변수의 값에 대한 접근이 가능하며, 포인터 연산에 의해서 값을 변경할 수 있다. 따라서 포인터 연산의 위험성이 존재한다.
#include <iostream>
using std::cout;
using std::endl;
void fun(int *a, int *b){
*a += 10;
*b += 10;
cout << "a: " << *a << "\n" <<"b: " << *b << endl;
}
int main(){
int a = 5;
int b = 10;
fun(&a, &b);
cout << "a: " << a << "\n" <<"b: " << b << endl;
}
3. Reference 를 이용한 Call By Reference
포인터를 이용한 Referece와 마찬가지로 함수 외부에 선언된 변수의 접근이 가능하며, 포인터 연산을 할 필요가 없으므로 보다 안정적이다. 하지만 함수의 호출 형태를 구분하기 어렵다.
#include <iostream>
using std::cout;
using std::endl;
void fun(int &a, int &b){
a += 10;
b += 10;
cout << "a: " << a << "\n" <<"b: " << b << endl;
}
int main(){
int a = 5;
int b = 10;
fun(a, b);
cout << "a: " << a << "\n" <<"b: " << b << endl;
}
***** result *****
a 값 : 11
b 값 : 11
a and b value = 11, 11
Call By Value 와 Call by Reference 는 구분해서 사용되어야 하는데, Call by Value는 함수 호출시 인자 전달 과정에서 값의 복사가 발생한다. 따라서 조금 부담스럽지만, 실제 변수의 데이터를 유지할 수 있는 장점이 있다. Call by Reference는 전달되는 인자를 레퍼런스로 받음으로 데이터의 복사 연산이 필요없지만 실제 변수의 데이터를 변경할 수 있기 때문에 원본 데이터가 손실될 수 있다. 따라서, 환경변수와 같은 데이터는 Call by Value가 적당하고, 데이터 처리는 Call by Reference 가 적당하다.
'C 언어 개열 > C++ ' 카테고리의 다른 글
클래스 선언과 클래스 구현 (0) | 2010.08.25 |
---|---|
C++ 객체지향 기초 (0) | 2010.08.22 |
포인터(Pointer) 변수와 레퍼런스(Reference) 변수의 이해 (0) | 2010.08.19 |
const 키워드와 메모리 영역 (0) | 2010.08.19 |
using 키워드와 전역변수 접근방법 (0) | 2010.08.19 |