포인터 전달과 참조 전달이란?
C++에서 함수에 변수를 전달할 때 기본적으로는 값 복사본이 넘어가기 때문에, 함수 내부에서 아무리 값을 바꿔도 원래 변수에는 영향을 주지 않습니다. 하지만 포인터에 의한 전달(Pass by Pointer) 또는 참조에 의한 전달(Pass by Reference)을 사용하면 함수 내부에서 호출자의 원본 변수 값을 직접 수정할 수 있습니다.
아래에서 두 방식을 각각 예제 코드와 함께 살펴보고, 그 차이점을 비교해 보겠습니다.
1. 포인터에 의한 전달 (Pass by Pointer)
포인터 전달은 변수의 메모리 주소를 함수에 넘기는 방식입니다. 함수 내부에서 역참조(*) 연산자를 사용해 해당 주소의 실제 값에 접근합니다.
#include <iostream>
using namespace std;
void swap(int* a, int* b) {
int c = *a; // a가 가리키는 값 저장
*a = *b; // b의 값을 a에 대입
*b = c; // 저장해 둔 값을 b에 대입
}
int main() {
int m = 7, n = 6;
cout << "Before Swap\n";
cout << "m = " << m << " n = " << n << "\n";
swap(&m, &n); // 주소를 전달
cout << "After Swap by pass by pointer\n";
cout << "m = " << m << " n = " << n << "\n";
}실행 결과
Before Swap m = 7 n = 6 After Swap by pass by pointer m = 6 n = 7
호출 시 &m, &n처럼 주소 연산자(&)를 사용해 변수의 주소를 넘겨야 한다는 점에 유의하세요.
2. 참조에 의한 전달 (Pass by Reference)
참조 전달은 변수의 별명(alias)을 함수에 넘기는 방식입니다. 함수 내부에서는 일반 변수처럼 사용하지만, 실제로는 원본 변수 그 자체를 가리킵니다.
#include <iostream>
using namespace std;
void swap(int& a, int& b) {
int c = a; // a(원본 m)의 값 저장
a = b; // b(원본 n)의 값을 a에 대입
b = c; // 저장해 둔 값을 b에 대입
}
int main() {
int m = 7, n = 6;
cout << "Before Swap\n";
cout << "m = " << m << " n = " << n << "\n";
swap(m, n); // 변수 자체를 전달
cout << "After Swap by pass by reference\n";
cout << "m = " << m << " n = " << n << "\n";
}실행 결과
Before Swap m = 7 n = 6 After Swap by pass by reference m = 6 n = 7
참조 전달에서는 호출부에서 특별한 연산자 없이 변수 이름만 그대로 넘기면 됩니다. 문법이 간결하고 직관적이라는 장점이 있습니다.
두 방식의 차이점 비교
두 방식 모두 함수 내부에서 원본 변수의 값을 변경할 수 있으므로, 위 예제처럼 스왑(swap) 결과는 동일하게 나타납니다. 하지만 다음과 같은 차이가 있습니다.
- 참조(Reference): 이미 존재하는 변수에 붙이는 또 다른 이름입니다. 반드시 선언과 동시에 초기화해야 하며,
NULL이 될 수 없어 상대적으로 안전합니다. - 포인터(Pointer): 변수의 메모리 주소를 저장하는 변수입니다. 초기화하지 않거나
nullptr(NULL)을 가질 수 있어, 역참조 전에 유효성 검사가 필요합니다. - 문법: 포인터는
*,&연산자를 명시적으로 사용해야 하지만, 참조는 일반 변수처럼 사용하므로 코드가 더 깔끔합니다. - 재지정: 포인터는 실행 중 다른 객체를 가리키도록 변경할 수 있지만, 참조는 한 번 묶이면 다른 변수를 가리킬 수 없습니다.
정리
포인터 전달과 참조 전달은 결과적으로 같은 동작을 수행하지만, 참조는 NULL이 될 수 없고 문법도 단순하기 때문에 특별한 이유(예: 선택적 인자 처리, 배열 순회 등)가 없다면 참조에 의한 전달을 사용하는 것이 더 안전하고 권장되는 방식입니다.