"; $foo++; $bar--; } ?>위의 코드를 실행하면 결과는 어떻게 될까? 반목문을 5번 수행하면서 다음과 같은 출력 결과를 낸다는 것을 쉽게 알 수 있다.
The value of foo is: 5, and the value of bar is 5 The value of foo is: 6, and the value of bar is 4 .... The value of foo is: 10, and the value of bar is: 0여기서 중요한 점은 변수 $foo와 $bar가 서로 독립적이라는 점이다. 그래서 변수 각각이 수정된다고 하더라도 다른 변수에 영향을 주지 않는다. PHP에서 참조는 개별적인 두 개의 변수를 하나처럼 사용할 수 있게 한다. 따라서 동시에 두개의 변수를 수정할 수 있다. 위의 코드에서 약간 변경된 다음의 코드를 살펴보도록 하자.
"; $foo++; $bar--; } ?>위의 코드에서 두 번째 줄이 변경되었음을 주목하기 바란다. $foo의 값을 단순히 $bar에 대입하는 대신, $bar가 $foo를 가리키도록 =& 연산자를 사용한 것이다. 차이가 무엇일까? 위의 코드가 수행된 결과를 살펴보자.
The value of foo is: 5, and the value of bar is: 5 The value of foo is: 5, and the value of bar is: 5 .... The value of foo is: 5, and the value of bar is: 5보다시피 두 변수 모두 초기값에서 변경되지 않았다. 처음에는 이것이 버그처럼 보인다고 해도 일단은 코드를 자세히 살펴보도록 하자. 첫 라인에서 변수 $foo에 5라는 정수값을 대입하였다. 다음에 $foo를 가리키는 참조를 만들고 그것을 $bar라 지정하였다. for 루프에서는 두 변수를 출력하였고 처음에는 예상한 것처럼 두 변수 값이 모두 5로 출력된다. 그 다음 $foo의 값을 1 증가시키고, $bar의 값을 1 감소시켰다. 이 과정이 반복된다. 그런데 $foo와 $bar의 값이 왜 변하지 않을까?
[그림 1] 독립적인 변수로서의 $foo와 $bar
[그림 2] 변수 $foo를 가리키는 참조로서의 $bar
참고 도서 |
"variable1", 1=>"variable2", 2=>"variable3"); $ref1 = &myarray; // Reference the entire Array $ref2 = &myarray[0]; // Reference to the first index $ref3 = &myarray[1]; // Reference to the second index ?>참조를 이용한 값 전달
위의 방법에서 split_string() 함수는 2개가 아닌 4개의 파라미터를 갖는다. 처음 두 개의 파라미터는 위에서 이미 설명했다. 나머지 두 개의 파라미터는 결과가 저장될 변수를 참조하고 있는 것이다. 위 함수의 리턴값은 함수 동작의 성공여부를 나타내는 불린(Boolean) 값인 것을 살펴보기 바란다. 위 함수는 다음처럼 사용될 수 있다.
"; } if(split_string($input_text, 10, &$first_half, &$second_half) == true) { echo "First segment of input: $first_half이 코드의 출력은 다음과 같다.
"; echo "Second segment of input: $second_half
"; } ?>
Could not split input, cut-point is entire string! First segment of input: abcdefghij Second segment of input: klmnopqrstuvwxyz위에서 보는 것처럼 함수가 참조를 파라미터로 사용했기 때문에 손쉽게 두 개의 리턴값을 얻을 수 있게 됐고, 함수의 리턴값을 에러 검사에 사용할 수 있게 됐다. 파라미터로 참조를 사용하는 것이 항상 좋은 것은 아니지만 이는 개발자에게는 많은 유연성을 제공해준다(특히 고급 알고리즘을 디자인할 때).
이전 글 : 크로스-브라우저 애니메이션
다음 글 : Programming C# - 5부
최신 콘텐츠