대입 연산자를 call by value
방식으로 값을 복사하는 것에 대해 학습했습니다.
좀 더 심화적으로 컴퓨터의 내부를 들여다 본다면 대입연산자는 한가지 더 또다른 의미를 부여할 수 있습니다.
바로 참조 대입이라는 것입니다.
컴퓨터 언어에서 일반적인 =
대입 연산자 이외에 참조
라는 새로운 대입 연산자가 존재합니다.
참조라는 개념을 이해하기 위해서는 컴퓨터 구조 및 메모리 시스템에 대해서 좀 더 추가적인 이해가 필요합니다.
컴퓨터를 구매할 때 메모리가 8G, 16G, 32G 등 용량을 표시합니다.
실제적으로 컴퓨터는 수많은 메모리 공간을 가지고 있으며 각각의 메모리 저장소 하나하나는 고유의 번호가 존재합니다.
호텔에서 수많은 방 앞에 번호를 붙여 놓은 것처럼 말입니다.
앞에서 = 대입 연산자의 경우에는 변수명만으로 프로그램 처리를 했습니다.
참조는 변수명과 함께 방 번호와 같이 메모리의 번호로 이용하는 개념입니다.
참조 대입 연산자는 =와 &를 결합한 =&로 표시합니다.
|문법|
$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
에서는 &
를 사용합니다.