스왑
Swap
잘못된 예시 (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와 d의 값이 바뀌지 않은 채 출력되게 된다.
값이 바뀌지 않는 이유는 Swap 함수에 매개변수로써 전달되는 a와 b는 c와 d의 실제 값이 전달되는 것이 아닌, c와 d의 값이 복사되어 전달되기 때문이다.
즉, 사용하는 공간 자체가 다르다.
따라서, c와 d의 값은 바뀌지 않고, a와 b의 값만 바뀐 채로 함수가 종료된다.
결과 : c = 10, d = 20
이를 해결하기 위한 2가지 방법이 있다.
첫 번째는 매개변수에 주소를 전달하는 방법이다.
예시 (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;
}
다음과 같이 주소를 전달하게 되면 a와 b는 포인터 변수로써 c와 d의 주소로 접근하고 실제 값에 직접 접근하고 바꾸게 된다.
결과 : c = 20, d = 10
두 번째는 매개변수를 레퍼런스로써 전달하는 방법이다.
예시 (Call by Reference)
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와 d의 값을 복사해오는 것이 아니라 c와 d의 주소에 a와 b라는 이름이 각각 붙게 되어 c와 d의 실제 값이 서로 바뀌게 된다.
결과 : c = 20, d = 10