정의 및 사용 방법
PHP에서 참조 변수(reference variable)는 특정 변수를 가리키는 또 다른 이름(별명)입니다.
특징
- 마치 사람에게 본명과 별명이 있듯이, 참조 변수도 원래 변수를 대신해 같은 값을 공유합니다.
- 따라서, 한쪽 값을 바꾸면 다른 쪽 값도 함께 변경됩니다.
- 변수를 일반 변수로 할당하면 PHP의 Copy-on-Write(COW) 메커니즘으로 실제 값이 변경되기 이전까지만 메모리를 공유합니다. 값이 변경되면 각각 별도의 메모리를 가지게 되어 메모리 관리가 비효율적일 수 있습니다. 반면, 참조 변수는 항상 원래 변수와 메모리를 공유하므로, 큰 데이터를 다룰 때 효율적으로 사용할 수 있습니다.
참조 변수를 만드는 구문
$참조변수 = &$원래변수;
$참조변수
는 새로 만들 참조 변수 이름입니다.&
기호가 참조임을 의미하며 , 앞 뒤 공백 유무와 관계없이 동일하게 동작합니다.
(예:$참조변수 = &$원래변수;
와$참조변수 = & $원래변수;
는 동일)- 구문 자체는 한 줄로 참조를 생성하는 문법입니다.
기본 예제
// 원래 변수
$a = 10;
// 참조 변수 생성
$b = &$a; // $b는 $a를 참조하는 별명(alias)입니다.
// 원래 변수의 값을 변경
$a = 20;
// 참조 변수의 값도 변경됨
echo $b; // 20
// 참조 변수의 값을 변경
$b = 30;
// 원래 변수의 값도 변경됨
echo $a; // 30
부연설명
- PHP에서 참조(reference)는 값이 저장된 위치를 가리킵니다.
- 참조 변수(reference variable)는 특정 변수의 값을 가리키는 참조를 공유하는 변수입니다.
- 참조 변수와 원래 변수는 값을 공유하므로, 한쪽을 변경하면 다른 쪽도 자동으로 변경됩니다.
유용성
PHP에서 참조 변수는 값을 복사하지 않고 원본 데이터를 직접 공유할 수 있게 해 주므로, 상황에 따라 메모리 절약과 성능 향상에 매우 유용합니다.
다음과 같은 경우에 참조 변수를 사용하면 효과적입니다.
- 함수를 선언할 때 매개 변수로 전달하는 변수에 적용
- 큰 데이터를 다른 변수에 할당할 때
함수를 선언할 때 매개 변수로 전달하는 변수에 적용
PHP는 함수를 호출하면 매개변수 값을 기본적으로 복사해서 사용합니다.
특히, 큰 배열이나 객체를 복사하면 메모리를 많이 사용할 수 있습니다. 사용자 정의 함수를 만들 때 매개 변수에 참조 변수를 사용하면, 값 복사를 피하고 원본 데이터를 그대로 전달할 수 있어 메모리를 절약할 수 있습니다.
예제
다음은 사용자 정의 함수를 만들 때 매개변수에 참조 변수를 사용한 간단한 예제입니다.
/* 참조 변수를 사용한 사용자 정의 함수 예제 */
// 배열을 매개변수로 받는 함수 정의
// & 기호를 사용하여 참조 변수로 전달
function addOne(&$arr) { // &$arr : 참조 변수로 전달됨
// 배열의 각 요소를 1씩 증가
foreach ($arr as &$value) {
$value += 1;
}
}
// 원래 배열
$numbers = [1, 2, 3];
// 함수 호출: 참조로 전달
addOne($numbers);
// 함수 안에서 값이 바뀌었으므로, 원본 배열도 변경됨
print_r($numbers);
/*
출력:
Array
(
[0] => 2
[1] => 3
[2] => 4
)
*/
큰 데이터를 다른 변수에 할당할 때
배열이나 객체처럼 큰 데이터를 새로운 변수에 할당하면, PHP는 기본적으로 값이 실제로 변경될 때까지 메모리를 공유합니다. 하지만 참조 변수를 사용하면, 항상 같은 메모리를 공유하도록 할 수 있어, 불필요한 복사를 방지하고 메모리 사용을 줄일 수 있습니다. 즉, 큰 데이터를 다룰 때 성능과 메모리 효율을 높이는 데 유용합니다.
또한, 원본 변수의 이름이 명시적이지 않아 개발자가 원하는 변수 이름, 즉 기존 변수의 별명을 새로 만들고 싶을 때 유용합니다.
예제
// 상황 1: 큰 데이터를 다룰 때 메모리 효율
$bigArray = range(1, 1000000); // 큰 배열 생성
$aliasArray = &$bigArray; // 참조 변수로 별명 생성
$aliasArray[0] = 999; // 값 변경
echo $bigArray[0]; // 999, 원본 배열도 즉시 반영
// 참조 변수를 사용했으므로 불필요한 복사 없이 메모리 효율 유지
// 상황 2: 변수 이름이 명시적이지 않을 때 별명을 새로 만들고 싶을 때
$original = "Hello World";
$greeting = &$original; // $greeting이라는 새 이름으로 별명 생성
$greeting = "Hi there!";
echo $original; // Hi there!, 원본 변수에도 즉시 반영
// 기존 변수의 값을 공유하면서, 개발자가 원하는 이름으로 접근 가능
주의할 점
참조 변수는 값을 복사하지 않고 원본 데이터를 직접 공유할 수 있게 해 주므로, 상황에 따라 메모리 절약과 성능 향상에 매우 유용하지만, 이 유용한 점이 반대로 매우 중요하게 다루어져야 할 때가 있습니다.
참조 변수로 값을 변경하거나 삭제하면 원본 데이터도 동일하게 적용되기 때문에 원본 변수의 데이터 처리에 대한 가독성의 어려움이나 실수 등을 유발할 경우가 생길 수 있습니다.