이 글에서는 PHP에서 자주 사용되는 두 가지 인자 전달 방식, 즉 값에 의한 전달(Pass by Value)과 참조에 의한 전달(Pass by Reference)에 대해 알아보겠습니다.
두 개념의 차이를 정확히 이해하면 함수가 변수를 다루는 방식을 예측할 수 있어, 의도치 않은 버그를 예방하고 더 안전한 코드를 작성하는 데 큰 도움이 됩니다.
값에 의한 전달(Pass by Value)이란?
PHP에서는 일반적으로 함수에 인자를 전달할 때 값에 의한 전달 방식을 기본으로 사용합니다. 이 방식에서는 함수 내부에서 인자의 값이 변경되더라도, 그 변경 사항이 함수 외부의 원래 변수에는 영향을 주지 않습니다.
즉, 함수에는 변수의 '복사본'이 전달되기 때문에 원본 데이터는 안전하게 보호됩니다.
값에 의한 전달 예제
간단한 예제를 통해 확인해 보겠습니다.
<?php
function calculate($a){
$a++;
echo $a . "<br/>";
}
$a = 5;
calculate($a);
echo $a;
?>
실행 결과
6
5
코드 설명
위 예제에서는 변수 $a의 값을 calculate() 함수에 값으로 전달했습니다. 함수 내부에서는 $a가 1 증가하여 6이 출력되지만, 이 변경은 복사본에만 적용된 것입니다.
따라서 함수 외부에서 다시 출력한 $a의 값은 여전히 5로 유지됩니다. 이것이 값에 의한 전달의 핵심 특징입니다.
참조에 의한 전달(Pass by Reference)이란?
반면, 어떤 경우에는 함수가 인자의 값을 직접 수정해야 할 필요가 있습니다. 이때 사용하는 것이 바로 참조에 의한 전달입니다.
참조로 변수를 전달하면 함수는 변수의 복사본이 아닌 원본 변수 자체를 다루게 되므로, 함수 내부에서 변경한 값이 외부에도 그대로 반영됩니다.
참조 전달을 활성화하는 방법은 간단합니다. 함수 정의부에서 매개변수 이름 앞에 앰퍼샌드(&)를 붙여주면 됩니다.
참조에 의한 전달 예제
<?php
function calculate(&$a){
$a++;
}
$a = 5;
calculate($a);
echo $a;
?>
실행 결과
6
코드 설명
이번에는 $a를 참조로 전달하여 calculate() 함수에 넘겼습니다. 함수 정의에서 &$a처럼 앰퍼샌드가 붙어 있기 때문에, 함수 내부에서 $a의 값을 증가시키면 외부의 원래 변수도 함께 변경됩니다.
그 결과, 함수 호출 후 출력된 $a의 값은 6입니다.
주의 사항: 참조 기호는 함수 정의에만!
중요한 점은 참조 기호(&)는 함수를 '호출'할 때가 아니라 함수를 '정의'할 때만 붙인다는 것입니다. 함수 정의만으로 충분히 올바르게 참조 전달이 이루어집니다.
예전에는 calculate(&$a)처럼 호출 시점에 &를 붙이는 방식(호출 시간 참조, call-time pass-by-reference)도 허용되었지만, PHP 5.4부터는 폐기(deprecated)되었으며 사용 시 오류가 발생합니다. 따라서 반드시 함수 정의부에만 &를 사용해야 합니다.
정리: 두 방식의 핵심 차이
- 값에 의한 전달: 함수 내부에서 값을 변경해도 외부 원본 변수는 그대로 유지됩니다.
- 참조에 의한 전달: 함수 내부에서 값을 변경하면 외부 원본 변수도 함께 변경됩니다.
- 참조 전달 문법: 함수 정의에서 매개변수 이름 앞에 &를 붙입니다(호출 시점에는 붙이지 않음).
두 전달 방식의 차이를 명확히 구분하고 상황에 맞게 활용하면, 코드의 예측 가능성과 안정성을 모두 높일 수 있습니다.