값에 의한 호출
변수가 매개변수로서 함수에 전달될 때 변수의 값만을 복사
원래의 값이 바뀌지 않음

참조에 의한 호출
매개변수로 사용되는 변수에 대한포인터를 전달
함수내에서 매개변수로 사용되는 변수의 값을 변경
함수란 무엇인가?

▶ 값에 의한 호출(Call by Value)

C 언어에서 가장 기본적인 인수 전달 방법.
호출된 함수는 형식 매개 변수의 기억 장소를 별도로 유지.
함수를 호출하는 프로그램의 실 인수 값을 호출된 함수의 형식 인수에 복사해서 다른 지역 변수들과 동일하게 취급.
값에 의한 호출 기법에서는 실인수의 값이 절대로 변하지 않음.

▶ 참조에 의한 호출 ( Call by Reference )

참조에 의한 인수 전달 기법은 실 매개 변수의 주소를 호출된 함수에 대응하는 형식 매개 변수에 보내는 방법.
실인수의 값이 아니라 실인수의 주소를 전달 ( 형식 인수는 이 주소를 참조하여 실행 )
참조에 의한 호출(call by reference, call by address, call by location) 방법은 가인수의 값을 변경시키면 실인수의 값도 변경
반환되는 값이 여러 개이거나 배열 전체를 전달하는 경우에 주로 이용.



함수란 자료에 동작을 가하고 값을 반환하는 부 프로그램으로 C++프로그램에서 빠지질 수 없는 함수가
바로 main()함수로 처음 시작할 때 main()이 자동적으로 불려지고 또 main()이 다른 함수를 부를 수가
있습니다.
먼저 함수에 대한 전반적인 소개를 하면..

함수의 종류
1) 일반함수
정의,선언,호출이 엄격히 구분되며 Compiler에 의해 처리되어 object file을 만들며 분할 Pro
gramming의 기초가 됩니다.
2) 매크로 함수
전처리계인 #define에 의해 정의되는 함수.
3) inline함수
매크로 함수의 특성을 갖지만 compiler에 의해 처리되며 일반함수와 동일한 매개변수 전달 방
법을 취합니다.

함수간의 정보 전달 방법
1) 매개변수에 의한 방법
주로 함수와 함수간의 정보 전달 방법으로 쓰인다.
- 값에 의한 호출(Call by value)
매개변수의 값 자체를 전달
- 포인터 참조에 의한 호출(Call by pointer reference)
매개변수의 주소를 전달
- 참조에 의한 호출(Call by reference)
실매개변수를 공유하여 참조
2) 외부변수에 의한 방법
주로 광역적으로 정보를 전달하거나 현 시스템의 상태등을 알고자 할 때 사용.


일반함수에서 정의, 선언, 호출에 대해 예를 들면,
#include

void main()
{
double power(double base, int exponent); // 함수의 선언(원형)
double base,result;
int exponent;

cout << "밑수 및 지수를 입력하시오\n";
while (cin >> base >> exponent)
{
result = power(base, exponent); // 함수의 호출
cout << "밑수("<< base <<")" << "지수("<< exponent <<")" << "결과 :"<< result << endl;
}
}

double power (double x, int y) // 함수의 정의
{
double ans="x";
for (int i=1;i < y;i++)
ans*="x";
return ans;
}
위의 예제에서 함수의 선언부분인 double power(double base, int exponent); 에서 double은 반환값의 형
을 의미하고 power은 함수명을 의미하며 double base, int exponent은 매개변수를 의미한다. power()라는
함수의 원형이 있고 함수원형을 함수의 정의와 비교해보면 함수명,반환형, 매개변수형이 똑같습니다. 만일
다르다면 컴파일러 장애가 발생할 것입니다. 다른 점이 있다면 함수 원형은 마지막에 세미콜론으로 끝난다
는 것입니다.

이제 전역 변수와 지역 변수에 대해 알아봅시다.
먼저 전역 변수란 것은 어떤 특정 함수의 바깥에서 정의된 변수는 전역 범위 규칙을 가지고 main()함수를
포함하여 프로그램내 어디서나 사용이 가능합니다. 이에 반해 지역변수는 함수몸체 안에서 선언하는데 이
지역변수란 그 함수 안에서만 존재합니다.

다음의 예를 봅시다.
#include

void mytest(); // 함수원형
int x=1,y=2; // 전역변수

void main()
{
cout << "x="<< x <<" \n"; cout << "y="<< y <<" \n"; mytest(); // 함수선언
cout << "x="<< x <<" \n"; cout << "y="<< y <<" \n";
}

void mytest() // 함수정의
{
int x="3;" // 지역 변수
cout << "this x="<< x <<" \n"; cout << "this y="<< y <<" \n";
}


출력은 다음과 같다.
x=1
y=2
this x=3
this y=2
x=1
y=2
함수 mytest 내의 지역변수로 선언한 x의 값이 3이 되므로 this x=3이 되고 그 외의 값들은 모두 전역변수
로 선언되어 있기 때문에 같게 나오는데 여기서 주의 해야 할 것은 C++에서는 전역변수를 거의 쓰지를 않는
다는 것인데 이유는 전역변수는 공유되 자료이기 때문에 어느 함수 하나가 다른 함수 모르게 전역변수를 바
꿀 수 있기 때문입니다. 그래서 나중에 버그가 나면 잡기도 힘들고 나중에 유지, 보수 하기가 쉽지가 않기
때문입니다.


이제 함수의 매개변수 전달방법을 알아봅시다.
값에 의한 호출방법(Call by value )
: 매개 변수의 전달시 매개변수의 값을 전달하는 것으로 실매개변수가 호출된 함수에 의해 영향을
받지 않습니다.
#include <iostream.h>
void main()
{
void test(int, int); // 함수 선언
int a = 10, b = 20;
test(a,b); // 함수 호출
cout << "a=" << a <<" " << "b=" << b << endl;
}

void test(int x, int y) // 함수 정의
{
int temp;
temp = x;
x = y;
y = temp;
}


결과는 a=10 b=20이지만 내부적으로 x와 y의 값은 20, 10이다.
결국 실매개변수가 호출함수에 의해 값이 변하지 않는다는 것을 알 수 있습니다.


포인터 참조에 의한 호출(Call by point reference)
: 대상 객체의 주소값을 전달하는 방식으로 형식 매개변수에 포인터 변수가 사용된다.

#include <iostream.h>
void main()
{
void test(int*, int*); // 함수 선언
int a = 10, b = 20;
test(&a,&b); // 함수 호출, a와b의 주소값을 전달
cout << "a=" << a <<" " << "b=" << b << endl;
}

void test(int *x, int *y) // 함수 정의
{
int temp;
temp = *x;
}


결과는 a=20 b=10이 되고 x는 a의 주소값을 가지고 y는 b의 주소값을 가지게 된다.


참조에 의한 호출(Call by reference)
: 참조형을 이용하여 매개변수를 전달하는 것으로 함수호출시 형식매개변수인 참조형이 실매개 변
수로 초기화되어 함수 내부에서 실매개변수를 참조하여 사용할 수 있다.

#include <iostream.h>
void main()
{
void test(int&, int&); // 함수 선언
int a = 10, b = 20;
test(a,b); // 함수 호출, 형식매개 변수인
cout << "a=" << a <<" " // 참조형이 실매개 변수로 초기화 << "b=" << b << endl;
}

void test(int &x, int &y) // 함수 정의
{
int temp;
temp = x;
x = y;
y = temp;
}


결과적으로 a=20 b=20이 되는데 결국 함수내부에서 실매개변수를 참조하여 사용하는 것입니다.
Retrieved from http://wiki.zeropage.org/wiki.php/HardcoreCppStudy/첫숙제/ValueVsReference/변준원
last modified 2021-02-07 05:23:22