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

C++에서 함수로 객체를 전달하는 5가지 방법 완벽 정리

C++에서는 객체를 함수에 전달하는 방법이 여러 가지 있으며, 각 방식마다 복사 여부와 원본 데이터 변경 가능성이 다릅니다. 클래스 X가 있고 이를 fun이라는 함수에 전달한다고 가정하고, 대표적인 5가지 전달 방식을 하나씩 살펴보겠습니다.

1. 값으로 전달 (Pass by Value)

객체를 값으로 전달하면 함수 스코프 안에 객체의 얕은 복사본(shallow copy)이 새로 생성됩니다. 따라서 함수 내부에서 아무리 값을 수정해도 호출자가 넘긴 원본 객체에는 아무런 영향을 주지 않습니다. 단, 객체 크기가 클수록 복사 비용이 커진다는 점을 유의해야 합니다.

선언

void fun(X x);

호출

X x;
fun(x); // x의 복사본이 함수로 전달됨

2. 참조로 전달 (Pass by Reference)

객체에 대한 참조(reference)를 함수에 전달하는 방식입니다. 복사본이 생성되지 않으므로 성능상 유리하며, 함수 내부에서 수정한 내용은 그대로 원본 객체에 반영됩니다.

선언

void fun(X &x);

호출

X x;
fun(x); // x 자체에 대한 참조가 전달됨

3. const 참조로 전달 (Pass by Const Reference)

객체에 대한 const 참조를 전달하는 방식입니다. 함수 내부에서 객체를 직접 수정하거나 재할당할 수 없습니다(단, 객체 내부 상태를 변경하는 멤버 함수 호출은 가능할 수 있습니다). 복사본을 만들지 않으면서도 원본을 보호하고 싶을 때, 즉 읽기 전용 접근만 필요한 경우에 가장 널리 사용되는 방법입니다.

선언

void fun(const X &x);

호출

X x;
fun(x); // 읽기 전용 참조로 전달됨

4. const 포인터로 전달 (Pass by Const Pointer)

객체를 가리키는 const 포인터를 전달하는 방식입니다. 함수 내부에서 포인터 자체를 수정하거나 다른 주소로 재할당할 수 없으며, 객체의 복사본도 생성되지 않습니다. 함수가 객체의 주소만 필요로 하고 포인터를 변경하지 않아야 할 때 유용합니다.

선언

void fun(const X *x);

호출

X x;
fun(&x); // x의 주소가 const 포인터로 전달됨

5. 포인터로 전달 (Pass by Pointer)

객체에 대한 일반 포인터를 전달하는 방식입니다. 참조로 전달하는 것과 동작이 매우 유사하며, 복사본은 생성되지 않습니다. 차이점이라면 함수 내부에서 포인터 자체를 변경할 수 있고, 호출 시 명시적으로 주소 연산자(&)를 사용해야 한다는 점입니다.

선언

void fun(X *x);

호출

X x;
fun(&x); // x의 주소가 전달됨

전달 방식 비교 요약

전달 방식복사본 생성원본 수정 가능주요 용도
값으로 전달OX원본 보호가 필요한 소규모 객체
참조로 전달XO함수에서 원본을 수정해야 할 때
const 참조로 전달XX읽기 전용 접근 (가장 권장됨)
const 포인터로 전달X포인터 재할당 불가주소 기반 접근 + 포인터 보호
포인터로 전달XO참조와 유사, C 스타일 인터페이스

일반적으로 객체를 수정할 필요가 없다면 const 참조 전달이 복사 오버헤드 없이 안전하기 때문에 가장 권장되는 방식이며, 함수가 객체의 상태를 변경해야 한다면 참조 전달을 사용하는 것이 좋습니다.