phpclass/클래스활용2000. 6. 12. 14:49
여기서는 객체지향언어에 대한 이론을 설명하지는 않을 것이며, 단지 객체지향언어에서 다루어지는 기본 개념을 중심으로 PHP에서 어떻게 표현되는가를 다룰 것입니다. 객체지향언어 이론에 대하여 궁금하면 관련서적, 웹사이트를 방문해 보세요.
함수 중복정의(함수 오버로딩;function overloading)란?
함수 오버로딩이란 같은 이름을 가지고 파라미터의 리스트만 다른 함수 여러 개를 생성하는 방법입니다. 이것의 목적은 데이터의 데이터형만 다르다면, 같은 함수 이름으로도 각각의 데이터 데이터형에 맞게 알맞은 연산을 수행하도록 하는 데 있습니다.
PHP3에서의 함수 오버로딩
PHP3 에서는 이와 같이 함수를 중복 정의할 수 있는 함수 오버로딩을 지원하지 않습니다. 이것은 PHP 홈페이지에 게시된 공식문서에서도 잘 나타나 있습니다. 아래는 http://www.php.net/manual/utiltions.php3 문서 내용 중에서 발췌한 것입니다. 이 문서는 오래된 문서라 현재 온라인 상으로는 확인되지 않습니다.
......
PHP does not support function overloading,
nor is it possible to undefine or redefine previously-declared functions.
......
PHP3에서의 함수 오버로딩 구현
PHP 에서 지원하는 변수에 대한 데이터형에는 "integer(정수형)", "double(실수형)", "string(문자열)", "array(배열)", "object(객체)"가 있습니다. 그러나 PHP에서는 C에서처럼 변수에 대한 데이터형을 미리 선언할 필요가 없습니다. 그런데 함수 오버로딩에서는 인수의 데이터형을 가지고 같은 이름의 여러 개의 함수들을 구분시켜 줍니다. 따라서 PHP에서도 함수 오버로딩을 구현하려면 데이터형을 지정할 필요가 있으며 인수의 데이터형이 맞는 함수가 없을 때는 함수명이 같더라도 아무것도 실행해서는 안됩니다. PHP에서는 함수의 인수에 데이터형을 지정할 수 없지만 지정할 수 있다고 가정하고 아래와 같은 함수 오버로딩을 구현할 방법을 찾아보도록 하겠습니다.
[code php;gutter:false] class test {
var $int_value; // 정수형이 저장될 데이터멤버
var $str_value; // 문자열이 저장될 데이터멤버

function setvalue(integer $int_val) {
$this->int_value = $int_val;
}

function setvalue(string $str_val) {
$this->str_value = $str_val;
}

function setvalue(string $str_val, integer $int_val) {
$this->int_value = $int_val;
$this->str_value = $str_val;
}
} [/code]
위와 같은 함수 오버로딩을 구현하려면 아래와 같이 오버로딩 함수명에서 각 인수의 데이터형을 판단하여 데이터형에 맞는 해당 함수로 분기시켜주면 됩니다.
[code php;gutter:false] class test {
var $int_value; // 정수형이 저장될 데이터멤버
var $str_value; // 문자열이 저장될 데이터멤버

function setvalue ($p0="_", $p1="_") {
if (gettype($p0) == "string" && $p0 != "_"
&& gettype($p1) == "integer") {
return $this->setvalue2($p0, $p1);
} else if (gettype($p0) == "string" && $p0 != "_") {
return $this->setvalue1($p0);
} else if (gettype($p0) == "integer") {
return $this->setvalue0();
} else {
die("에러발생");
}
}

function setvalue0 ($int_val) {
$this->int_value = $int_val;
}

function setvalue1 ($str_val) {
$this->str_value = $str_val;
}

function setvalue2 ($str_val, $int_val) {
$this->int_value = $int_val;
$this->str_value = $str_val;
}
} [/code]
PHP4에서의 함수 오버로딩
2000 년5월22일 작성된 온라인 매뉴얼을 살펴보면 PHP4에서도 아직 함수 오버로딩을 지원하지 않는 것 같습니다. 아래는 Chapter 12. Functions User-defined functions 문서 내용 중에서 발췌한 것입니다.
......
In PHP3, functions must be defined before they are referenced.
No such requirement exists in PHP4.

PHP does not support function overloading, nor is it possible to undefine or
redefine previously-declared functions.

PHP3 does not support variable numbers of arguments to functions,
although default arguments are supported
(see Default argument values for more information).
PHP4 supports both: see Variable-length argument lists and
the function references for func_num_args(),
func_get_arg(), and func_get_args() for more information.
http://www.php.net/manual/utiltions.php 05/22/00
......
혹시 함수 오버로딩을 사용할 경우가 생긴다면(별로 없겠지만) PHP에서 정식으로 지원할 때까지는 불편하더라도 PHP3용으로 구현된 함수 오버로딩 코드를 PHP4에서도 계속 사용해야 할 것 같습니다.

Posted by 방글24
Ver 0.1.0 (2002.2.12)
  • classopen() 함수를 newobject()함수로 함수명 변경 및 인터페이스 변경
  • classinfo() 함수를 classchain()함수로 함수명 변경 및 인터페이스 변경
  • 함수 오버로딩(function overloading) 기능 삭제
  • 복수의 객체 생성 허용
  • 정적 데이터멤버(static data member) 지원 방법 변경
  • 사용자 정의 생성자 및 소멸자 명명방법 변경
  • PHP 4.0.4부터 지원하는 레퍼런스 기능을 사용한다. 따라서 4.0.3 이하 버전에서는 동작되지 않는다.
2000.7.10
  • 소멸자에서의 데이터멤버 인식 오류를 수정하기 위한 객체생성함수 수정 -> newobject() 함수를 classopen()함수로 함수명 변경 및 내용 수정
2000.7.6
  • "정적 데이터멤버" 인식 오류 수정
2000.7.5
  • 사용함수를 3개로 축소
    classdefine() : 클래스 정의 해석 함수
    newobject() : 객체 생성 함수
    classinfo() : 클래스 상속 관계 표시 함수
  • 객체 생성 함수의 전달 인자의 수량 및 데이터형 수정
2000.6.9
  • PHP4까지 사용범위 확대 -> PHP3와 PHP4에서 모두 사용 가능
  • 다중상속을 단일상속으로 변경해주는 알고리즘 개선으로 상속관계가 단순화됨
  • 정적 데이터멤버(static data member) 지원
2000.5.30
  • 동일 클래스 내에서 복수의 함수 오버로딩(function overloading) 정의 가능하도록 함수 오버로딩 기능 확장
  • 생성자에 인수(argument)를 10개까지 전달하도록 수정
  • "사용자 정의 생성자"를 정의하기 위한 예약어 "constructor"를 지정하지 않고도 "사용자 정의 생성자"를 정의할 수 있도록 수정
  • 소멸자(destructor) 지원
2000.5.18 민주화운동기념일
  • 함수 오버로딩(function overloading) 기능 추가
  • 전역변수 $gClassobject 추가
2000.5.5 어린이날
  • 최상위 클래스로부터 모든 파생클래스의 생성자 실행 지원
  • 다중상속(multiple inheritance) 지원
  • 동일한 조상클래스(ancestor class)를 가진 클래스의 다중상속 지원

Posted by 방글24
정적 데이터멤버란?
생성된 모든 객체들이 공유하는 공통적인 정보가 필요할 때에 사용되는 것이 정적멤버(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