값/주소/참조에 의한 호출


Call by Value / Call by Address / Call by Reference


호출은 하는 방식에 따라 값에 의한 호출, 주소에 의한 호출, 참조에 의한 호출로 나뉜다.


Call by Value


값에 의한 호출은 단순히 그 값만을 필요로 할 때 사용된다.

원본 값을 변경 없이 사용하기만 하고 싶을 때 사용하는 방식이다.

함수가 호출 될 때 넘기고자 하는 변수의 값을 복사하여 파라미터로써 넘겨준다.

예시

void Swap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;

    printf("a = %d, b = %d\n", a, b);
}

int main()
{
    int c = 10;
    int d = 20;

    printf("c = %d, d = %d\n", c, d);

    Swap(c, d);

    printf("c = %d, d = %d\n", c, d);

    return 0;
}

결과 : c = 10, d = 20


Call by Reference

참조에 의한 호출은 값의 변경이 일어난다.

호출 시에 파라미터로써 넘겨받은 변수에 파라미터의 이름으로 별명이 붙는다.

아래 예시의 경우, c와 d라는 변수에 a와 b라는 별명이 붙어 주소를 공유하게 되는 것이다.

예시

void Swap(int& a, int& b)
{
    int temp = a;
    a = b;
    b = temp;

    printf("a = %d, b = %d\n", a, b);
}

int main()
{
    int c = 10;
    int d = 20;

    printf("c = %d, d = %d\n", c, d);

    Swap(c, d);

    printf("c = %d, d = %d\n", c, d);

    return 0;
}

결과 : c = 20, d = 10

Call by Address

주소에 의한 호출도 값의 변경이 일어난다.

전달하고자 하는 변수의 주소 값을 파라미터로 전달받아 접근하는 방식이다.

참조에 의한 호출처럼 별명을 붙여 그 이름의 주소로 접근하는 것이 아닌, 파라미터로 전달받은 함수의 주소로 직접 접근한다.

예시

void Swap(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;

	printf("*a = %d, *b = %d\n", *a, *b);
}

int main()
{
	int c = 10;
	int d = 20;

	printf("c = %d, d = %d\n", c, d);

	Swap(&c, &d);

	printf("c = %d, d = %d\n", c, d);

	return 0;
}