개요
C++에서는 참조에 의한 호출(Call by Reference) 방식을 활용하면 세 개의 숫자를 함수에 전달하여 순환 순서(Cyclic Order)로 손쉽게 교환할 수 있습니다. 이 글에서는 cyclicSwapping() 함수를 정의하고, 포인터를 통해 원본 변수의 값을 직접 변경하는 방법을 단계별로 살펴봅니다.
순환 교환이란?
순환 교환은 세 변수의 값을 한 칸씩 밀어내듯이 바꾸는 연산입니다. 예를 들어 x = 2, y = 5, z = 7일 때 순환 교환을 수행하면 다음과 같은 결과가 됩니다.
- x ← z의 값 (2 → 7)
- y ← x의 값 (5 → 2)
- z ← y의 값 (7 → 5)
값 자체를 복사해 전달하는 '값에 의한 호출(Call by Value)'과 달리, 참조에 의한 호출은 변수의 주소를 전달하기 때문에 함수 내부에서 변경한 값이 호출자에게 그대로 반영됩니다.
전체 소스 코드
다음은 참조에 의한 호출을 사용해 세 숫자를 순환 순서로 교환하는 완전한 C++ 프로그램입니다.
#include<iostream>
using namespace std;
void cyclicSwapping(int *x, int *y, int *z) {
int temp;
temp = *y;
*y = *x;
*x = *z;
*z = temp;
}
int main() {
int x, y, z;
cout << "Enter the values of 3 numbers: " << endl;
cin >> x >> y >> z;
cout << "Number values before cyclic swapping..." << endl;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "z = " << z << endl;
cyclicSwapping(&x, &y, &z);
cout << "Number values after cyclic swapping..." << endl;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "z = " << z << endl;
return 0;
}
실행 결과
위 프로그램을 컴파일 후 실행하면 다음과 같은 출력을 확인할 수 있습니다.
Enter the values of 3 numbers: 2 5 7
Number values before cyclic swapping...
x = 2
y = 5
z = 7
Number values after cyclic swapping...
x = 7
y = 2
z = 5
핵심 로직 분석: cyclicSwapping() 함수
프로그램의 핵심인 cyclicSwapping() 함수는 임시 변수 temp 하나만을 이용해 세 값을 순환적으로 교환합니다. 매개변수가 포인터(int *)로 선언되어 있기 때문에, 함수 내부에서 역참조(*)를 통해 원본 변수에 직접 접근할 수 있습니다.
void cyclicSwapping(int *x, int *y, int *z) {
int temp;
temp = *y; // y의 값을 temp에 백업
*y = *x; // x의 값을 y에 대입
*x = *z; // z의 값을 x에 대입
*z = temp; // 백업해 둔 y의 값을 z에 대입
}- temp = *y; — y가 가리키는 값을 임시 변수에 저장해 둡니다.
- *y = *x; — x의 값을 y에 대입합니다.
- *x = *z; — z의 값을 x에 대입합니다.
- *z = temp; — 처음에 저장해 둔 y의 값을 z에 대입합니다.
만약 일반 변수로 값을 전달했다면 함수 내부에서는 복사본만 수정될 뿐, main()의 실제 값은 변하지 않았을 것입니다. 이것이 참조에 의한 호출의 핵심 장점입니다.
main() 함수의 흐름
main() 함수에서는 사용자로부터 세 개의 숫자를 입력받은 뒤, 교환 전 값을 화면에 출력합니다. 이후 cyclicSwapping()을 호출하는데, 이때 각 변수의 주소를 넘겨주기 위해 주소 연산자 &를 사용한다는 점에 유의하세요.
cyclicSwapping(&x, &y, &z);
함수 호출이 끝나면 교환된 값을 다시 출력하여 결과를 확인합니다.
마무리
이처럼 참조에 의한 호출을 사용하면 함수가 여러 개의 변수 값을 동시에 수정할 수 있어, 스왑(swap) 연산을 깔끔하게 구현할 수 있습니다. 참고로 최신 C++에서는 포인터 대신 참조(reference)를 매개변수로 사용하거나, std::swap 같은 표준 라이브러리 기능을 활용하는 방법도 있으니 함께 익혀두면 좋습니다.