Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 참조 전달보다 포인터 전달이 유리한 경우는 언제일까?

C++에서 함수에 객체를 전달할 때 포인터(pointer)참조(reference)는 모두 원본 객체에 접근할 수 있게 해주지만, 몇 가지 중요한 차이점이 있습니다.

포인터 전달의 장점

1. 널(null) 값 처리 가능

포인터는 null 값을 가질 수 있는 반면, 참조는 반드시 유효한 객체를 가리켜야 합니다. 따라서 함수가 "객체 없음(no object)" 상태를 나타내야 하는 경우에는 반드시 포인터를 사용해야 합니다. 예를 들어 선택적(optional) 매개변수를 처리할 때 nullptr을 전달하는 방식은 매우 유용합니다.

2. 호출 지점에서의 명확성

포인터로 전달하면 호출 지점(call site)에서 해당 객체가 참조로 전달되는지 값으로 전달되는지 명확하게 구분할 수 있습니다. 인자 앞에 &(주소 연산자)가 붙어 있으면 주소가 전달된다는 것을 즉시 알 수 있기 때문입니다. 반면 참조 전달은 호출 코드만 봤을 때는 값 복사처럼 보여서 의도를 파악하기 어려울 수 있습니다.

포인터로 전달하는 예제

#include <iostream>
using namespace std;

void swap(int* a, int* b) {
    int c = *a;
    *a = *b;
    *b = c;
}

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

호출부에서 swap(&m, &n);처럼 주소 연산자를 사용하므로, 변수의 주소가 전달되어 원본 값이 변경된다는 사실을 코드만 보고도 쉽게 알 수 있습니다.

참조로 전달하는 예제

#include <iostream>
using namespace std;

void swap(int& a, int& b) {
    int c = a;
    a = b;
    b = c;
}

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

참조 전달은 문법이 간결하고 null 체크 없이 안전하게 사용할 수 있다는 장점이 있습니다. 다만 호출부에서 일반 값 전달과 형태가 동일해 보이므로, 원본이 수정될 수 있다는 사실이 코드상으로 드러나지 않는 단점이 있습니다.

정리: 어떤 것을 선택해야 할까?

  • 객체가 항상 존재해야 한다면 → 참조(reference)를 사용하세요. null 가능성을 원천적으로 차단하여 더 안전한 코드가 됩니다.
  • "객체 없음" 상태가 필요하거나 선택적 매개변수라면 → 포인터(pointer)를 사용하고, 함수 내부에서 반드시 null 여부를 검사하세요.
  • 코드 가독성과 의도 전달이 중요하다면 → 포인터 전달이 호출 지점에서 수정 의도를 더 명확히 보여줍니다.

결론적으로, 포인터 전달은 null 허용과 호출 지점의 명시성이라는 실질적인 이점을 제공합니다. 반면 참조 전달은 문법이 깔끔하고 null 위험이 없으므로, 객체가 반드시 필요한 상황에서는 참조가 더 나은 선택입니다. 두 방식의 특성을 이해하고 상황에 맞게 활용하는 것이 중요합니다.