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

Icarus<Wing>·2022년 10월 8일

앞에서, 우리는 함수의 동작 원리에 대해 배워보았다. 이번에는 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개의 댓글