정적 데이터멤버란?
생성된 모든 객체들이 공유하는 공통적인 정보가 필요할 때에 사용되는 것이 정적멤버(static data member)입니다. "정적 데이터멤버"는 다른 일반 데이터 멤버와 달리 각각의 객체에 기억장소가 할당되는 것이 아니라, 단 한 개의 기억장소만이 할당되고 모든 객체에 의하여 공유됩니다. 하지만 데이터 멤버의 정보는 각각의 객체가 모두 가지고 있는 것처럼 간주됩니다. 이와 같이 모든 객체에서 공통되는 데이터 멤버를 정적 데이터멤버로 선언하므로 써, 모든 객체에서 중복되는 기억장소를 절약할 수 있습니다. 예를 들어 물건을 파는 상점에서 각 물품에 대한 객체는 별도로 생성되더라도 물품을 판 수입금액은 결국 각 객체가 공유해야하는 데이터이지요. 이와 같이 모든 객체가 공유해야 하는 데이터를 정적멤버로 정의하여 사용하면 편리하지요.
PHP에서의 정적 데이터멤버
PHP에서는 정적 데이터멤버를 지원하지 않습니다. 만약 PHP에서 정적 데이터멤버를 흉내내려면 가장 쉬운 방법이 전역변수를 이용하는 방법입니다. PHP에서의 정적 데이터멤버를 흉내내는 방법에 대한 것은 메뉴 "핍클래스홈>>객체지향언어로서의 PHP>>정적 데이터멤버"를 참조바랍니다.
정적 데이터멤버 지원
후키라이브러리에서는 이러한 정적 데이터멤버를 쉽게 사용할 수 있도록 하였습니다. 이전 버전에서는 classdefine 함수 내에서 정적 데이터멤버를 정의하도록 하였습니다. 그러나 classdefine 함수 내에서 정적 데이터멤버를 정의해 주려면 문자열 작성 규칙이 까다로워 사용하기가 상당히 불편하였습니다. 그래서 굳이 classdefine 함수 내에서 정의할 필요가 없이 어느 곳에서나 특별한 정의없이 사용할 수 있도록 0.1.0 버전에서는 수정하였습니다. 대략 사용방법은 아래와 같습니다.
[code php;gutter:false] <?php

classdefine("
class BankInterclass extends clsString, clsArray, clsDate {}
");

//
// 데이터멤버 $this->SAVINGS 에는 각 사람(객체)마다의 저축 내용을 기록
// 정적 데이터멤버 $this->STATIC->SAVINGS 에는 모든 사람의 저축을 합하여 기록
//
class Bank extends BankInterclass {
var $SAVINGS_FILE = "/tmp/savings";
var $SAVINGS = 0; // 저금통장

//
// 생성자
//
function Bank($argv) { }

//
// 소멸자
//
function _Bank() { }

function add($savings) {
$this->SAVINGS += $savings;
$this->STATIC->SAVINGS += $savings;
}

function subtract($savings) {
$this->SAVINGS -= $savings;
$this->STATIC->SAVINGS -= $savings;
}

function reset() {
$this->STATIC->SAVINGS = 0;
}

function print_family() {
print "우리가족 총 저금액=" . $this->STATIC->SAVINGS . "원\n";
}

function print_person($name="나") {
if ($this->SAVINGS > 0) {
$t = "저금액";
} else {
$this->SAVINGS = abs($this->SAVINGS);
$t = "지출액";
}
print "${name}의 $t=" . $this->SAVINGS . "원\n";
}
}

?> [/code]
이 예에서 보는 바와 같이 정적 데이터멤버의 경우는 $STATIC 데이터멤버를 통해 접근하도록 되어 있습니다.
[code php;gutter:false] $this->STATIC->SAVINGS -= $savings; [/code]
여기에서 데이터멤버 $SAVINGS는 모든 객체에서 공유하게 되는 정적 데이터멤버라고 할 수 있습니다.

Posted by 방글24