review:swap함수를 통한 매개변수의 전달

Icarus<Wing>·2022년 10월 8일
0

앞에서, 우리는 함수의 동작 원리에 대해 배워보았다. 이번에는 swap함수를 사용하여 call by value, call by address, 그리고 call by reference를 통해 매개변수가 어떻게 전달되는지 알아보자.

call by value(또는 pass by value)

#include <iostream>

using namespace std;

void swap(int x, int y)
{
	int tmp;
	tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 10, b = 20;

	swap(a, b);

	cout << "a= " << a << ",b= " << b << endl;

	return 0;
}

  • 그림을 통한 call by value의 이해
  • swap을 호출하면 argument가 parameter로 복사되는데, swap함수 내에서 복사본이 스와핑을 한것이지, argument에는 아무 영향이 없기 때문에 출력하면 값이 그대로 나온다.
  • call by value는 사칙연산을 통해 값을 반환할 때 유용하다. 이는 main해서 해도되는데, 지역변수에서 함수를 수행함으로써 메인 메모리의 사용을 줄일 수 있다.

call by address

#include <iostream>

using namespace std;

void swap(int *x, int *y)
{
	int tmp;
	tmp = *x;
	*x = *y;
	*y = tmp;
}

int main()
{
	int a = 10, b = 20;

	swap(&a, &b);

	cout << "a= " << a << ",b= " << b << endl;

	return 0;
}

  • 그림을 통한 call by address의 이해
  • 앞에서 본 call by value는 복사본만 스와핑을 하기 때문에 문제가 되었다.
    ->이를 해결하기 위해, argument의 주소를 전달하는 방법이 바로 call by address이다.
    • parameter에는 변수의 주소를 저장하기 위한 int형 포인터를 사용한다.
    • swap함수 내에서 x,y는 주소를 바꾸기 때문에 역참조'*'를 사용해서 값을 바꾸자.

call by reference

#include <iostream>

using namespace std;

void swap(int &x, int &y)
{
	int tmp;
	tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 10, b = 20;

	swap(a, b);

	cout << "a= " << a << ",b= " << b << endl;

	return 0;
}

  • 그림을 통한 call by reference의 이해
  • call by reference는 call by address의 진화버전이다. 즉, 포인터를 사용하지 않고, 참조자를 매개변수로 사용함으로써 동일 스택 프레임 내에서 스와핑을 할 수 있다.

    참조자는 a와 b의 별명이라, 메모리를 사용하지 않는다.(단,for loop문에서는 사용하면 안되는 제약조건이 있는데 추가공부가 필요할 것 같다)

  • 소스코드 상에서는 모듈화된 프로그래밍인데, 기계어 입장에서는 동일 스택 프레임 상에서 함수가 호출된 것이기 때문에 monolithic programming이라 할 수 있다.
profile
모든 코드에는 이유가 있기에 원인을 파악할 때까지 집요하게 탐구하는 것을 좋아합니다.

0개의 댓글