U E D R , A S I H C RSS

Hardcore Cpp Study/첫숙제/Value Vs Reference/변준원

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

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

▶ 값에 의한 호출(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;
}
  • 여기서 power(double x, int y) 안에서 따옴표가 없어야 할 거 같은데...? -영동
  • 그리고 함의 원형과 정의의 인자 이름을 같게 써 주는것이 가급적 좋을 것 같다. -영동

위의 예제에서 함의 선언부분인 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;
  • x = *y;
  • y = temp;
}


결과는 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이 되는데 결국 함내부에서 실매개변를 참조하여 사용하는 것입니다.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:22
Processing time 0.0411 sec