=, & 참조


대입 연산자를 call by value 방식으로 값을 복사하는 것에 대해 학습했습니다.
좀 더 심화적으로 컴퓨터의 내부를 들여다 본다면 대입연산자는 한가지 더 또다른 의미를 부여할 수 있습니다.
바로 참조 대입이라는 것입니다.

컴퓨터 언어에서 일반적인 = 대입 연산자 이외에 참조라는 새로운 대입 연산자가 존재합니다.


메모리 주소


참조라는 개념을 이해하기 위해서는 컴퓨터 구조 및 메모리 시스템에 대해서 좀 더 추가적인 이해가 필요합니다.

컴퓨터를 구매할 때 메모리가 8G, 16G, 32G 등 용량을 표시합니다.
실제적으로 컴퓨터는 수많은 메모리 공간을 가지고 있으며 각각의 메모리 저장소 하나하나는 고유의 번호가 존재합니다.

호텔에서 수많은 방 앞에 번호를 붙여 놓은 것처럼 말입니다.

앞에서 = 대입 연산자의 경우에는 변수명만으로 프로그램 처리를 했습니다.
참조는 변수명과 함께 방 번호와 같이 메모리의 번호로 이용하는 개념입니다.


call by reference


참조 대입 연산자는 =와 &를 결합한 =&로 표시합니다.

|문법|

$a = &$b;

위의 표현은 $a 변수에 $b 값을 저장하는 것이 아니라 $b가 저장되어 있는 메모리 주소를 전달하는 것입니다.

메모리의 주소를 복사하게 되면 $a와 $b는 같은 메모리 공간을 가리키며 $a$b로 동일한 메모리의 공간에 값을 저장하거나 읽어올 수 있습니다.

그럼 예제를 참고하여 실제적인 동작을 학습해보겠습니다.

다음 예제는 참조를 통해 메모리 주소를 복사해보는 예제입니다.

예제 파일 callbyr-01.php

<?php
	$a = 123;
	echo "a 값입니다 = ". $a ."<br>";

	$b = &$a;
	echo "b 값입니다 = ". $b."<br>";
?>

결과

a 값입니다 = 123
b 값입니다 = 123

위의 예제를 보면 변수 $a는 정수 값 123을 가지고 있습니다.
그리고 변수 $b는 변수 $a의 참조(방번호 주소값) 값을 변수 $b에 대입하게 됩니다.

변수 $b는 메모리의 저장 위치 값으로 $a를 가리킵니다.
즉 같은 호텔방의 번호를 가리키는 것과 같습니다.

방 키를 두 개로 복사한 것이죠.

다음 예제는 메모리를 복사한 후에 복사된 변수에 새로운 값을 저장해봅니다. 또한 원 변수의 값이 어떻게 처리되는지 확인해보겠습니다.

예제 파일 callbyr-02.php

<?php
	$a = 123;
	echo "a 값입니다 = ". $a ."<br>";

	$b = &$a;
	echo "b 값입니다 = ". $b."<br>";

	$b = "abcd";
	echo "a 값입니다 = ". $a."<br>";
?>

결과

a 값입니다 = 123
b 값입니다 = 123
a 값입니다 = abcd

두 번째 예는 $b는 $a와 똑같은 메모리 방 번호를 가리키고 있습니다. 즉, 복사된 방 키입니다.

$b에 문자열 “abcd”를 대입을 하고, $a의 값을 출력해봅니다. $a의 값은 $b가 입력한 값과 같은 것을 확인할 수 있습니다.

이렇게 변수의 메모리 주소를 전달하여 데이터를 처리하는 방식을 call by reference라고 합니다.


&


& 기호는 변수의 메모리 주소를 표현하는 기호입니다.
변수명 앞에 & 기호가 붙게 되면 해당 변수의 메모리 주소 값을 나타냅니다.
이는 C 언어에서 많이 사용하는 포인터와 비슷한 개념입니다.

C언어에서는 * 기호를 사용했지만 PHP에서는 &를 사용합니다.