PHP4와 PHP5의 객체 참조
- Thursday, October 29, 2009, 5:04
- Articles, Featured, PHP
- Add a comment
꽤 오래전 이야기라서 많은 분들이 알고 계시리라 생각합니다만 정리도 할 겸 적어 봅니다.
지금은 대부분의 시스템에서 PHP5를 사용하고 있으리라 생각합니다. 하지만 아직도 어디건간 PHP4 코드가 동작하고 있겠죠. PHP4에서 PHP5로 넘어오면서 가장 큰 변화 중 하나는 객체 참조였습니다. PHP4가 개발되고 사용될 당시에는 일반적으로 PHP를 객체 지향적으로 작성하지 않았습니다. 그렇기 때문에 값을 참조로 넘기는 것이 좋은 생각은 아니었습니다. 물론 & 연산자를 이용해 참조를 지정할 수는 있습니다만 이해하기 어렵고 때때로 올바르지 않은 결과를 초래하기 까지 합니다.
시간이 흘러 객체 지향적인 프로그래밍을 하는 사람이 늘어나면서 PHP5에서는 객체 참조가 반영됐습니다. 이것은 $thing = new Thing; 처럼 객체를 생성하는 경우에는 참조를 반환하는 것입니다.
$thing = new Thing; $thing->Kind = 'PC'; $thing2 = $thing; $thing2->Kind = 'Mac'; echo $thing->Kind;
위 코드를 PHP4와 PHP5에서 각각 실행했을 때 PHP4에서는 “PC”가 출력되고 PHP5에서는 “Mac”이 출력됩니다.
만약 PHP4에서 “Mac”을 출력하고 싶다면 아래와 같이 작성해야 합니다.
$thing = new Thing; $thing->Kind = 'PC'; $thing2 = &$thing; $thing2->Kind = 'Mac'; echo $thing->Kind;
참조의 이점
참조를 사용하면 복사하는 것에 비해 메모리 공간 등에서 이점이 있습니다. $memory 라는 변수가 1MB를 자치한다면 참조를 사용하지 않고 $memory_copy 변수에 복사한다면 메모리 사용량은 2MB로 증가하게 됩니다. 아무래도 객체는 다양한 구성 요소를 갖고 있기 때문에 객체 지향을 적극 반영한 PHP5의 객체 참조는 당연한 결과입니다. 객체가 아니더라도 적절히 참조를 사용한다면 시스템 자원을 아낄 수 있을 것입니다.
참조를 사용하지 않는게 이로운 경우
참조가 성능상에 좋다고 해서 모든 경우에서 참조를 사용한다면 반대로 성능을 떨어뜨리거나 예상치 못한 오류가 발생할 수도 있습니다. 이를 고려해서 PHP5 에서도 객체 인스턴스가 아닌 값의 대입인 경우에는 복사를 합니다. 복사(값)와 참조의 차이는 간단하게 아래 그림처럼 표현할 수 있을 겁니다.
변수 $a 가 “Hello”라는 값을 직접 가지고 있는 반면, 변수 $b 와 같은 참조의 경우엔 값에 대한 메모리 주소 값을 갖고 있기 때문에 “Hello”라는 값을 가져오기까지 $a 에 비해서 상대적으로 속도가 느립니다. 복사를 한다면 메모리 상에서 영역을 확보하고 “Hello”라는 문자열을 추가하는 비용이 들긴 하지만 값을 얻어오는 데 드는 비용이 낮기 때문에 전체적인 속도면에서 이롭다고 할 수 있습니다.
하지만 아주 큰 값을 가진 변수를 복사한다던지 문자열을 반복해서 복사하는 경우라면 자칫 성능을 저하시킬 수도 있기 때문에 주의해야 합니다.


