이 가이드에서는 명확한 코드 예제를 통해 C++에서 포인터를 사용해 인수를 참조로 전달하는 방법을 설명합니다. 값 교환 등을 다룹니다.
소개
C++ 함수의 세계에서 데이터를 전달하는 기본 방식은 값 전달입니다: 함수는 원본 데이터의 복사본을 받습니다. 이는 원본 변수를 보호하지만, 큰 객체에서는 비효율적이며 함수가 호출자의 데이터를 수정할 수 없게 만듭니다.
참조 전달은 이 두 문제를 해결합니다. 데이터를 복사하는 대신 함수는 원본 변수에 대한 참조(또는 주소)를 받아 직접 조작할 수 있게 합니다. 이는 C++ 참조나 원시 포인터 두 가지 동등한 방식으로 달성됩니다. 두 접근법을 모두 이해하면 유연성과 메모리 처리에 대한 깊은 통찰을 얻을 수 있습니다.
// 값을 받는 함수
void func1(int numVal) {
// 코드
}
// 참조를 받는 함수 (C++ 참조 문법)
void func2(int &numRef) {
// 코드
}
int main() {
int num = 5;
// 값 전달
func1(num);
// 참조 전달
func2(num);
return 0;
}
void func2(int &numRef)의 &는 매개변수가 참조임을 나타냅니다. func2가 호출되면 num의 값이 아닌 주소가 전달되어 함수가 num을 직접 수정할 수 있습니다.
예제 1: C++ 참조로 값 교환하기
#include <iostream>
using namespace std;
// 참조를 사용한 교환 함수
void swap(int &n1, int &n2) {
int temp = n1;
n1 = n2;
n2 = temp;
}
int main() {
int a = 1, b = 2;
cout << "교환 전\n";
cout << "a = " << a << "\n";
cout << "b = " << b << "\n";
swap(a, b);
cout << "\n교환 후\n";
cout << "a = " << a << "\n";
cout << "b = " << b << "\n";
return 0;
}
출력
교환 전
a = 1
b = 2
교환 후
a = 2
b = 1
이 예제에서 swap은 두 개의 참조를 받습니다. n1과 n2가 a와 b의 별칭이므로 함수 내부에서의 변경이 원본 변수에 영향을 줍니다.
예제 2: 포인터로 값 교환하기
#include <iostream>
using namespace std;
// 포인터를 사용한 함수 프로토타입
void swap(int*, int*);
int main() {
int a = 1, b = 2;
cout << "교환 전\n";
cout << "a = " << a << "\n";
cout << "b = " << b << "\n";
// a와 b의 주소 전달
swap(&a, &b);
cout << "\n교환 후\n";
cout << "a = " << a << "\n";
cout << "b = " << b << "\n";
return 0;
}
// 포인터를 사용한 교환 함수
void swap(int* n1, int* n2) {
int temp = *n1;
*n1 = *n2;
*n2 = temp;
}
출력
교환 전
a = 1
b = 2
교환 후
a = 2
b = 1
여기서 swap은 원시 포인터를 받습니다. *로 역참조하여 제공된 주소의 값에 접근하고 수정합니다. 결과는 참조 버전과 동일하지만 포인터 문법은 주소 전달을 명시적으로 만듭니다.
참조와 포인터 중 선택은 문맥에 따라 다릅니다: 참조는 더 안전하고 깔끔한 문법을 제공하는 반면, 포인터는 메모리 주소에 대한 명시적 제어를 제공하며 동적 할당에 필요합니다.