phpsource/회원인증2001. 1. 12. 14:40
사용자가 접근할 수 있는 메소드는 아래와 같이 5개(write 함수는 쿠커용에서만 사용하며 세셔너용에서는 사용하더라도 아무런 기능을 수행하지 않는 더미함수임)가 제공됩니다. 모든 함수는 기본적으로 상품코드를 가지고 각 상품을 다루게 됩니다. 각 상품에 대한 명칭, 가격 등과 같은 정보는 class.article.php에서 정의되어 있는 상품정보 클래스를 통하여 얻을 수 있습니다.
[code c;gutter:false] void add(strign code, strint color, int num) void set(string code, string color, int value) array get() 또는 array get(string code) 또는 mixed get(string code, string color) void delete([string code [, string color]]) void write(void) [/code]
void add(string code, string color, int num)
add() 함수는 지정된 상품코드, 상품색상의 수량을 증감시킵니다.
[code php;gutter:false] $cart->add("B001", "백색", 1); // "B001" 백색 상품의 주문수량을 1 증가시킴 $cart->add("B001", "청색", -1); // "B001" 청색 상품의 주문수량을 1 감소시킴 [/code]
void set(string code, string color, int num)
0.0.2 버전부터 put() 함수명 대신에 set() 함수명으로 접근할 수 있습니다. 이 함수는 지정된 상품코드, 상품색상에 따른 주문수량을 지정된 값으로 설정합니다. 주문수량 num 값은 0 이상의 값으로 지정하여야 합니다.
[code php;gutter:false] $cart->set("B001", "청색", 1); // "B001" 청색 상품의 주문수량을 1개로 설정함 $cart->set("B002", "흑색", 3); // "B002" 흑색 상품의 주문수량을 3개로 설정함 [/code]
array get()
매개변수를 지정하지 않으면 장바구니 배열 전체를 되돌려줍니다.
[code php;gutter:false] $cartlist = $cart->get(); if (is_array($cartlist)) { while(list($code,$v)=each($cartlist)) { while(list($color,$num)=each($v)0 { echo "$code($color)의 주문수량은 $num 개입니다.\n"; } } } [/code]
array get(string code)
매개변수로 상품코드를 지정하면 해당하는 상품코드에 대한 상품정보를 배열로 되돌려줍니다.
[code php;gutter:false] $a001 = $cart->get("A001"); if (is_array($a001)) { while(list($color,$num)=each($a001)) echo "AOO1-$color=$num\n"; } [/code]
int get(string code, string color)
지정딘 상품코드, 상품색상에 대한 주문수량을 되돌려 줍니다.
[code php;gutter:false] $nums = $cart->get("A001", "백색"); // "A001" 백색 상품의 주문수량을 되돌려줌 [/code]
void delete([string code [, string color]])
매개변수로 상품코드와 상품색상을 지정하면 해당 주문수량을 삭제합니다. 매개변수로 상품코드만 지정하면 장바구니에 저장된 해당하는 상품코드의 전체 정보를 삭제합니다. 매개변수를 지정하지 않으면 장바구니 정보 전체를 모두 삭제합니다.
[code php;gutter:false] $cart->delete("A001", "청색"); // 장바구니에서 "A001" 청색 상품의 정보를 삭제함 $cart->delete("A001"); // 장바구니에서 상품코드 "A001"의 정보를 삭제함 $cart->delete(); // 현재 사용하고 있는 장바구니를 삭제함 [/code]
void write(void)
장바구니에 저장된 상품정보를 클라이언트에 있는 쿠키파일에 저장합니다. 이 함수는 내부적으로 PHP header() 함수를 사용하기 때문에 브라우저로 출력하는 문자가 발생하기 전에 수행하여야 합니다. 이 함수는 쿠커용에서만 정상적으로 사용될 수 있는 함수입니다. 그러나 세셔너용에서 사용하더라도 아무런 문제가 생기지는 않습니다. 세셔너용에서는 어떠한 기능도 들어있지 않은 더미함수로 정의되어 있습니다. 자세한 것은 쿠커(Cooker) 정보를 참조바랍니다.
[code php;gutter:false] <?php require("./cooker/class.cooker.php"); // 쿠커 require("./cart/class.carter4cooker.php"); // 쿠커용 장바구니 클래스 require("./cart/class.article.php"); // 상품정보 클래스 $cart = new Carter; $article = new Article; switch($count) { case "add" : $cart->add($code, $color, 1); break; case "dec" : $cart->add($code, $color, -1); break; case "del" : $cart->delete($code, $color); break; default : $cart->set($code, $color, $count); } $cartlist = $cart->get(); $cart->write(); // 쿠커용에서는 여기에서 장바구니 정보를 쿠키파일에 저장함 ?> . . 브라우저 화면에 출력할 코드를 생성할 부분 . [/code]

'phpsource > 회원인증' 카테고리의 다른 글

{쿠키회원인증}1.활용  (0) 2001.02.22
{장바구니클래스}3.다운로드  (0) 2001.01.12
{장바구니클래스}1.기본 구성  (0) 2001.01.12
{회원별페이지}  (0) 2000.11.21
{회원인증에 대하여}10.전체 구성  (0) 2000.10.10
Posted by 방글24
phpsource/회원인증2001. 1. 12. 14:34
세션함수(또는 세셔너) 및 쿠커를 이용하여 장바구니를 구현하였습니다.
PHP3에서 세션함수를 이용하기 위해서는 제가 공개한 세셔너-0.2.4을 문서상단에 포함하여 주세요. PHP4에서 사용할 때는 세셔너함수를 포함시키면 안됩니다.
쿠커(Cooker)용 장바구니에서는 PHP3와 PHP4에 관계없이 제가 공개한 쿠커-0.0.1을 문서상단에 포함하여 주세요.
장바구니 클래스 및 샘플 코드는 Tip&Tech&Download 게시판에 파일로 올려놓았습니다.
파일 구성
세셔너용
lib.sessioner.php - PHP3에서 세션함수를 사용하기 위한 라이브러리
class.carter4sessioner.php - 세셔너용 장바구니 클래스
class.article.php - 상품정보를 관리해주는 클래스
shopping.php3 - 쇼핑을 위한 쇼윈도우 샘플
cart.php3 - 장바구니를 보여주는 페이지 샘플
PHP4에서는 sessioner.php 파일이 필요없으며 cart.php3 및 shopping.php3 상단에 있는 세셔너 함수를 인클루드하는 부분을 삭제합니다.
[code php;gutter:false] require("./sessioner/lib.sessioner.php"); //<- PHP4에서는 삭제할 것 require("./cart/class.carter4sessioner.php"); require("./cart/class.article.php"); [/code]
쿠커용
class.cooker.php - 쿠커(Cooker; 쿠키정보 클래스)
class.carter4cooker.php - 쿠커용 장바구니 클래스
class.article.php - 상품정보를 관리해주는 클래스
shopping.php3 - 쇼핑을 위한 쇼윈도우 샘플
cart.php3 - 장바구니를 보여주는 페이지 샘플
쿠커를 사용하기 위해서는 PHP 버전에 관계없이 항상 문서 상단에 포함시켜야 합니다. class.article.php, cart.php3 및 shopping.php3 파일은 세셔너용과 동일합니다.
[code php;gutter:false] require("./cooker/class.cooker.php"); //<- PHP3, PHP4 모두에서 필요 require("./cart/class.carter4cooker.php"); require("./cart/class.article.php"); [/code]
장바구니 구조
장바구니는 세션함수를 이용하여 주문자가 주문처리하거나 로그아웃할 때까지 서버에 저장하도록 합니다.
ver 0.0.1
배열형태로 구성되었으며, 상품코드를 인덱스키로 하고, 주문수량이 값으로 저장되어 있습니다.
[code php;gutter:false] $Cart["A001"] = 4; // 상품코드 "A001"의 주문수량은 4개임 $Cart["A002"] = 2; // 상품코드 "A002"의 주문수량은 2개임 $Cart["B001"] = 3; // 상품코드 "B001"의 주문수량은 3개임 [/code]
ver 0.0.2
상품코드 및 상품색상에 의하여 분류할 수 있도록 2차원 배열로 구성되어 있습니다.
[code php;gutter:false] $CartData[상품코드][색상코드] = 주문수량 $CartData["A001"]["흰색"] = 4; // "A001" 흰색 상품의 주문수량은 4개임 $CartData["A002"]["갈색"] = 5; // "A002" 갈색 상품의 주문수량은 5개임 [/code]
장바구니 클래스(ver 0.0.2)
장바구니는 class.carter4sessioner.php(세셔너용), class.carter4cooker.php(쿠커용) 파일에서 클래스 Carter로 작성되어 있습니다. 생성자 매개변수로 장바구니로 이용할 세션변수명 또는 쿠키명을 지정할 수 있습니다. 생략하면 "PHP_CARTER_DATA"라는 이름을 사용합니다.
[code php;gutter:false] $cart = new Carter; // 장바구니 세션변수명 또는 쿠키명 = "PHP_CARTER_DATA" $cart = new Carter("mycart"); // 장바구니 세션변수명 또는 쿠키명 = "mycart" [/code]
쇼윈도우 화면
진열된 상품을 볼 수 있으며 이 화면에서 필요한 상품을 필요한 수량만큼 구매할 수 있습니다.
< 쇼윈도우 페이지 >
장바구니 보기 화면
쇼윈도에서 주문한 상품 리스트를 볼 수 있습니다. 이 화면 내에서 주문수량을 하나씩 추가하거나 줄일 수 있으며 필요없는 상품은 삭제할 수도 있습니다.
< 장바구니 보기 페이지 >

Posted by 방글24
phpclass/객체정보2000. 12. 28. 15:13
저장 매체의 변경
세셔너 함수를 작성하는데 추상클래스를 이용하였으면, 그 이점이 있어야 할 것 아닙니까? 그 한 예로 공개된 세셔너 함수에서 사용하고 있는 파일 시스템 대신에 데이터베이스를 이용하여 보도록 하겠습니다. 다른 클래스는 건드릴 필요가 전혀 없으며 오로지 클래스 sessStaticDevice 만 아래에 있는 클래스로 대체시키면 됩니다.
[code php;gutter:false] class sessStaticDevice extends sessStaticID {
var $startedPath;
var $BaseClass = "baseDbsql";
var $BaseObject;

function sessStaticDevice() {
$this->sessStaticID();
$this->Path = "Sessioner";
}

function _sessStaticDevice() {
$this->_sessStaticID();
}

function prvStartedDevice($path) {
$this->startedPath = $path;
}

function prvInitBase() {
if (!is_object($this->BaseObject)) {
$base = $this->BaseClass;
$this->BaseObject = new $base;
}
}

function prvGc() {
$this->BaseObject->query("SELECT id FROM "
.$this->startedPath
." WHERE lastused < "
.(time() - $this->Maxlifetime));
while ($record=$this->BaseObject->next_record())
$id_arr[] = $record["id"];
if (is_array($id_arr)) {
reset($id_arr);
while (list(,$id)=each($id_arr)) {
$this->prvOnEnd();
$this->BaseObject->query("DELETE FROM "
.$this->startedPath." WHERE id='$id'");
}
}
list($rows,$fields) = $this->BaseObject->query(
"SELECT id FROM ".$this->startedPath);
return $rows;
}

function prvRead() {
$this->BaseObject->query("SELECT value, lastused FROM "
.$this->startedPath." WHERE id='".$this->ID."'");

if ($record=$this->BaseObject->next_record())
return stripslashes($record["value"]);
return false;
}

function prvWrite($value) {
$this->BaseObject->query("REPLACE INTO "
.$this->startedPath." (id, value, lastused) "
."VALUES ('".$this->ID."', '"
.addslashes($value)."', ".time().")");
}

function prvDestroyDevice() {
$this->BaseObject->query("DELETE FROM "
.$this->startedPath." WHERE id='".$this->ID."'");
}
} [/code]
세셔너 데이터 저장용 테이블 생성
데이터베이스를 이용하기 때문에 먼저 세션 데이터를 저장할 테이블을 생성하여야 합니다. 아래는 MySQL 데이터베이스의 테이블을 생성하기 위한 SQL 문을 나타내었습니다.
[code sql;gutter:false] CREATE TABLE Sessioner (
id varchar(32) not null PRIMARY KEY,
value text not null,
lastused int(8)
); [/code]
session_start() 함수 수정
또 하나 추가로 처리하여야 할 것은 데이터베이스를 세셔너 함수 내에서 사용하기 위한 함수가 하나 추가되었습니다. 그것은 prvInitBase() 함수이며, 이 함수에서는 클래스 $sessStatic 내에서 사용할 데이터베이스 객체를 생성하는 역할을 합니다. session_start() 함수에서 스크립트 실행 후 단 한번만 실행시켜 주면 됩니다.
[code php;gutter:false] function session_start() {
//
// 데이터베이스를 이용하기 위해 새로 추가된 부분
//
$GLOBALS["sessStatic"]->prvInitBase();
return $GLOBALS["sessStatic"]->prvStart();
} [/code]
미니디비 파일 인클루드 및 객체 생성
데이터베이스 예제는 제가 공개한 미니디비를 이용하였기 때문에, 사용자 프로그램에서 세셔너 파일을 인클루드 하기 전에 미니디비 파일을 인클루드하여야 하며, session_start() 함수를 실행하기 전에 미니디비 클래스를 이용하여 데이터베이스 객체를 생성하여야 합니다. 이 때 객체명은 사용자가 임의로 지정할 수 있습니다.
[code php;gutter:false] <?php

require("./minidb/class.mysql.php");
require("./sessioner/sessbase.php");

$base = new baseDbsql("호스트명","사용자ID","비밀번호","디비명");

session_start();

......

?> [/code]
"......" 부분은 이미 공개한 세셔너함수-0.2.0 또는 0.2.1과 사용방법이 동일합니다. 물론 PHP4 세션함수 사용법과도 동일합니다. 데이터베이스용 세셔너함수에 대한 자료는 파일로 공개하지 않겠습니다. 필요한 것은 이곳에 모두 있기 때문에 여러분이 잘 이해하신 후 사용하시면 제대로 동작할 것입니다.

'phpclass > 객체정보' 카테고리의 다른 글

{참조}2.객체생성에서의 참조  (0) 2001.03.02
{참조}1.참조변수의 생성  (0) 2001.03.02
{추상클래스}5.세셔너 분석  (0) 2000.12.28
{추상클래스}4.PHP  (0) 2000.12.28
{추상클래스}3.자바  (0) 2000.12.28
Posted by 방글24
phpclass/객체정보2000. 12. 28. 15:04
세셔너함수(0.2.0, 0.2.1)의 설계개념
세셔너함수를 정의한 파일의 소스코드를 살펴보면 세셔너 함수들이 내부적으로 호출하고 있는 객체를 생성하기 위한 클래스가 다소 장황하게 작성되어 있습니다. 객체지향프로그래밍의 추상클래스라는 개념을 도입하여 작성되어 있어서 그렇게 보일 것입니다. 그러나 추상클래스 개념을 잘 활용한다면 많은 이점을 가져다 줄 것입니다.
사용자 함수의 구조
사용자가 접근할 수 있는 세셔너 함수들은 모두 전역함수를 이용하여 작성되어 있으나, 세셔너 함수가 내부적으로 사용하는 함수들은 sessStatic 라는 클래스에서 생성된 $sessStatic라는 객체를 이용하여 구현되었습니다.
[code php;gutter:false] function session_start() {
return $GLOBALS["sessStatic"]->prvStart();
}

function session_destroy() {
return $GLOBALS["sessStatic"]->prvDestroy();
}

function session_register($varname) {
return $GLOBALS["sessStatic"]->prvRegister($varname);
}

function session_unregister($varname) {
return $GLOBALS["sessStatic"]->prvUnregister($varname);
}

.
.
. [/code]
sessStatic 클래스의 구성
< 세셔너 함수의 구성(클래스 설계 및 구현) >
추상클래스 sessStaticID, sessStaticDevice, sessStaticEvent가 최상위 추상클래스 sessStaticAbstract로부터 각각 파생되도록 설계되었으며, 일반클래스 sessStatic가 sessStaticID, sessStaticDevice, sessStaticEvent로부터 다중 상속되도록 설계되어 있습니다. 일반클래스 sessStatic 에 이르러서는 상위클래스에 있는 모든 추상함수가 구현되므로 객체를 생성할 수 있게 되며 세셔너 함수 내에서 $sessStatic 라는 객체를 생성하여 세셔너 함수에서 접근할 수 있도록 하였습니다. PHP에서 다중상속을 지원하지 않으므로 아래와 같이 연속적인 단일상속으로 구현하였습니다.
[code php;gutter:false] class sessStaticAbstract { // 최상위 추상클래스
......
}

class sessStaticID extends sessStaticAbstract { // 세션ID 관리
......
}

class sessStaticDevice extends sessStaticID { // 저장매체 관리
......
}

class sessStaticEvent extends sessStaticDevice { // 이벤트 처리
......
}

class sessStatic extends sessStaticEvent { // 최하위 일반클래스
......
}

$sessStatic = new sessStatic; [/code]
sessStaticAbstract 클래스
추상클래스로 작성된 sessStaticAbstract에는 일반함수와 추상함수가 혼재되어 있습니다. 세션ID 관리함수, 저장매체 관리함수, 이벤트 처리 함수는 추상함수로 작성되어 있어서 하위클래스에서 이들 함수의 몸체가 구현되어 있습니다.
[code php;gutter:false] //
// 저장매체 관리함수
//
function prvRead() {}
function prvWrite($value) {}
function prvDestroyDevice() {}
function prvGc() {}
function prvStartedDevice($path) {}

//
// 이벤트 처리 함수
//
function prvOnStart() {}
function prvOnEnd() {}

//
// 세션ID 관리함수
//
function prvGetID() {}
function prvSetID($id) {}
function prvStartedID($name) {} [/code]
이와 같이 추상함수의 몸체에는 어떠한 코드도 정의되어 있지 않으며, 이 함수들의 하위클래스에서 그 동작이 구체적으로 명시됩니다.
추상클래스로 상속되는 하위클래스
추상클래스 sessStaticAbstract로부터 상속받는 하위클래스 sessStaticID, sessStaticDevice, sessStaticEvent 는 모두 부모클래스의 모든 추상함수를 구현하지 않기 때문에 일부함수가 계속 추상함수로 남게됩니다. 따라서 이들 하위클래스 모두 여전히 추상클래스라고 할 수 있습니다.
세셔너 함수 소스 코드를 보면 클래스 sessStaticEvent에 prvOnStart(), prvOnEnd()가 빠져 있을 것입니다. 세셔너 함수는 PHP4 세션함수와의 호환성을 목적으로 하기 때문에 PHP4 세션함수에 없는 이벤트 함수를 포함시킬 수 없었습니다. 이것은 객체지향프로그래밍 이론으로 보면 이 부분에서 에러가 발생할 것입니다. PHP 스크립트에서야 이런 개념이 없으니까 두리뭉실 넘어가고 있죠. 아래는 이벤트 함수를 구현한 완전한 StaticEvent 클래스입니다. 참조바랍니다.
[code php;gutter:false] class sessStaticEvent extends sessStaticDevice {
var $EventPath = ".";

function sessStaticEvent() {
$this->sessStaticDevice();
$this->prvEventFunc();
}

function _sessStaticEvent() {
$this->_sessStaticDevice();
}

function prvEventFunc() {
$eventfile = $this->EventPath."/event.sessioner.php";
clearstatcache();
if (is_file($eventfile)
&& !function_exists("sessioner_onStart")
&& !function_exists("sessioner_onEnd")) {
include($eventfile);
}
}

function prvOnStart() {
if (function_exists("sessioner_onStart"))
sessioner_onStart();
}

function prvOnEnd() {
if (function_exists("sessioner_onEnd"))
sessioner_onEnd();
}
} [/code]
일반클래스로 정의되는 최하위클래스 sessStatic
마지막으로 파생된 클래스 sessStatic 에 와서야 비로서 모든 추상함수가 구현됩니다. 세셔너함수 소스코드를 보면 실제로는 sessStaticEvent 클래스에서 모든 추상함수가 구현되지만 향후 세셔너가 확장되면서 또다른 추상함수가 추가될 수 있으며 그 때는 sessStaticEvent 클래스의 하위클래스에서 추가된 추상함수를 구현할 수 있기 때문에 설계 개념상 sessStaticEvent를 추상클래스로 분류하였습니다. 혼동없기를 바랍니다.
sessStatic 를 제외한 모든 상위클래스들은 추상클래스이므로 객체를 생성할 수 없으며 모든 추상함수를 구현한 일반클래스로 작성된 sessStatic를 이용하여 객체를 생성할 수 있습니다. PHP에서는 추상클래스 개념이 없으므로 객체를 생성할 수 있으나, 동작은 제대로 하지 않을 것입니다. 여기서 객체를 생성할 수 없다고 한 것은 추상클래스 개념으로 보았을 때 그렇다는 것으로 객체를 생성해서는 안된다는 것을 의미합니다. 세셔너 함수 파일 최하단에 보면 sessStatic 클래스를 이용하여 객체를 생성하여 내부적으로 사용하고 있습니다.
[code php;gutter:false] $sessStatic = new sessStatic; [/code]

'phpclass > 객체정보' 카테고리의 다른 글

{참조}1.참조변수의 생성  (0) 2001.03.02
{추상클래스}6.세셔너 확장  (0) 2000.12.28
{추상클래스}4.PHP  (0) 2000.12.28
{추상클래스}3.자바  (0) 2000.12.28
{추상클래스}2.C++  (0) 2000.12.28
Posted by 방글24
phpclass/객체정보2000. 12. 28. 15:03
추상함수(???)
PHP에는 추상함수나 추상클래스라는 개념이 없습니다. 있다고 가정하고 추상함수와 추상클래스를 흉내내어 보겠습니다. 아래와 같이 추상함수를 선언합니다.
[code php;gutter:false] function breathe() {} // 추상함수(메소드의 몸체는 없음) [/code]
추상클래스(???) 정의
클래스에 하나 이상의 추상함수가 있다면 그것을 추상클래스라고 가정하겠습니다.
[code php;gutter:false] //
// 추상클래스 animal
//
class animal {
function breathe() {} // 추상함수
} [/code]
추상함수의 오버라이드
하위클래스를 정의할 때는 추상함수 breathe()를 오버라이드해야 합니다.
[code php;gutter:false] //
// 추상클래스 animal로부터 파생된 일반클래스 fish
//
class fish extends animal {
//
// 추상함수 breathe()의 오버라이드
//
function breathe() {
print "Bubbling...\n";
}
} [/code]
추상클래스 예제
[code php;gutter:false] //
// 추상클래스 animal
//
class animal {
function eat() { // 일반메소드
print "Eating...\n";
}
function breathe() {} // 추상함수
}

//
// 추상클래스 animal로부터 파생된 일반클래스 fish
//
class fish extends animal {
//
// 추상함수 breathe()의 오버라이드
//
function breathe() {
print "Bubbling...\n";
}
}

//
// 프로그램의 최초 진입점
//
$my_fish = new fish;
$my_fish->breathe(); [/code]
이 경우에 프로그램은 클래스 fish에 정의된 breathe()함수를 수행하게 됩니다. 따라서 "Bubbling..."이 화면에 표시됩니다.

'phpclass > 객체정보' 카테고리의 다른 글

{추상클래스}6.세셔너 확장  (0) 2000.12.28
{추상클래스}5.세셔너 분석  (0) 2000.12.28
{추상클래스}3.자바  (0) 2000.12.28
{추상클래스}2.C++  (0) 2000.12.28
{추상클래스}1.개요  (0) 2000.12.28
Posted by 방글24
phpclass/객체정보2000. 12. 28. 15:02
추상메소드
추상메소드는 실제로 동작하는 부분이 없고 메소드 선언부만 있는 것을 말합니다. 추상메소드는 메소드앞에 abstract 키워드를 사용하여 일반메소드와 구별합니다. 그리고 생성자와 클래스 메소드 그리고 private 로 선언한 메소드는 추상메소드가 될 수없습니다.
[code java;gutter:false] abstract public void breathe(); // 추상메소드(메소드의 몸체는 없음) [/code]
추상클래스 정의
추상클래스는 추상메소드를 포함할 수 있고, 추상메소드를 포함하는 클래스는 반드시 추상클래스로 선언되어야 합니다. 추상클래스는 추상메소드와 마찬가지로 해당 클래스 앞에 abstract 키워드를 사용하여 다음과 같이 선언할 수 있습니다.
[code java;gutter:false] //
// 추상클래스 Animal
//
abstract class Animal {
abstract public void breathe(); // 추상메소드
} [/code]
추상메소드의 오버라이드
추상클래스는 반드시 하위 클래스를 가지며, 추상클래스를 상속받은 하위클래스는 반드시 상위클래스의 추상메소드를 모두 재정의 하여야 합니다.
[code java;gutter:false] //
// 추상클래스 Animal로부터 파생된 일반클래스 Fish
//
class Fish extends Animal {
//
// 추상메소드 breathe()의 오버라이드
// 이때에 항상 public을 붙여서 사용해야 한다.
//
public void breathe() {
System.out.println("Bubbling...");
}
} [/code]
추상클래스 예제
[code java;gutter:false] //
// 추상클래스 Animal
//
abstract class Animal {
public void eat() { // 일반메소드
System.out.println("Eating...");
}
abstract public void breathe(); // 추상메소드
}

//
// 추상클래스 Animal로부터 파생된 일반클래스 Fish
//
class Fish extends Animal {
//
// 추상메소드 breathe()의 오버라이드
//
public void breathe() {
System.out.println("Bubbling...");
}

//
// 프로그램의 최초 진입점
//
public static void main(String args[]) {
Fish my_fish = new Fish();
my_fish.breathe();
}
} [/code]
이 경우에 프로그램은 클래스 Fish에 정의된 breathe()함수를 수행하게 됩니다. 따라서 "Bubbling..."이 화면에 표시됩니다.
자바에서의 추상클래스에 대한 좀 더 자세한 정보는 관련 서적을 참고하시기 바랍니다.

'phpclass > 객체정보' 카테고리의 다른 글

{추상클래스}6.세셔너 확장  (0) 2000.12.28
{추상클래스}5.세셔너 분석  (0) 2000.12.28
{추상클래스}4.PHP  (0) 2000.12.28
{추상클래스}2.C++  (0) 2000.12.28
{추상클래스}1.개요  (0) 2000.12.28
Posted by 방글24
phpclass/객체정보2000. 12. 28. 15:01
순수가상함수(pure virtual function)
C++ 에서 함수 몸체가 없이 정의되는 함수이며 몸체 부분을 =0으로 지정하여야 합니다. 순수가상함수가 포함된 클래스를 추상클래스(Abstract Class)라고 하며, 이 추상클래스로는 직접 객체를 만들 수 없고 상속을 통해 다른 클래스를 생성하는 데 사용합니다. 추상클래스로부터 상속받은 클래스는 반드시 순수가상함수를 구현해야 합니다.
[code c;gutter:false] virtual void breathe(void) = 0; // 순수가상함수(메소드의 몸체는 없음) [/code]
추상클래스 정의
자바에서처럼 추상클래스를 구분하는 abstract와 같은 키워드는 없으며, 단지 클래스에 하나 이상의 순수가상함수가 있다면 그것을 추상클래스라고 합니다.
[code c;gutter:false] //
// 추상클래스 animal
//
class animal {
public:
virtual void breathe(void) = 0; // 순수가상함수
}; [/code]
순수가상함수의 오버라이드
하위클래스를 정의할 때는 순수가상함수 breathe()를 오버라이드해야 합니다. C++는 객체를 설정할 때 순수가상함수를 오버라이드하지 않는 것을 에러로 여깁니다. 즉, 한 클래스가 하나나 그 이상의 순수가상함수를 가진다면 그 클래스의 객체를 생성할 수 없습니다.
[code c;gutter:false] //
// 추상클래스 animal로부터 파생된 일반클래스 fish
//
class fish : public animal {
public:
void breathe(void);
} my_fish;

//
// 순수가상함수 breathe()의 오버라이드
//
void fish::breathe(void) {
cout << "Bubbling...\n";
} [/code]
추상클래스 예제
[code c;gutter:false] #include <iostream.h>
#include <conio.h>

//
// 추상클래스 animal
//
class animal {
public:
void eat(void); // 일반메소드
virtual void breathe(void) = 0; // 순수가상함수
};

//
// 추상클래스 animal로부터 파생된 일반클래스 fish
//
class fish : public animal {
public:
void breathe(void);
} my_fish;

//
// 모든 멤버함수 선언
//
void animal::eat(void) {
cout << "Eating...\n";
}

void fish::breathe(void) {
cout << "Bubbling...\n";
}

//
// 프로그램의 최초 진입점
//
main() {
my_fish.breathe();
getche();
return 0;
} [/code]
이 경우에 프로그램은 fish::breathe()함수를 수행하게 됩니다. 따라서 "Bubbling..."이 화면에 표시됩니다.
C++에서의 추상클래스에 대한 좀 더 자세한 정보는 관련 서적을 참고하시기 바랍니다.

'phpclass > 객체정보' 카테고리의 다른 글

{추상클래스}6.세셔너 확장  (0) 2000.12.28
{추상클래스}5.세셔너 분석  (0) 2000.12.28
{추상클래스}4.PHP  (0) 2000.12.28
{추상클래스}3.자바  (0) 2000.12.28
{추상클래스}1.개요  (0) 2000.12.28
Posted by 방글24
phpclass/객체정보2000. 12. 28. 14:58
메뉴 "객체지향언어로서의 PHP"에 포함시켜도 되는 주제이지만, 내용의 분량이 많아 별도의 메뉴로 분리하였습니다. 제가 공개한 세셔너함수-0.2.0을 작성하면서 도입된 객체지향프로그래밍 이론입니다.
여기에 있는 내용들은 관련 웹사이트나 관련 서적에 있는 내용을 정리(짜집기)한 것입니다.
추상클래스(abstract class)
추상클래스는 추상적인 클래스로써 그 구현이 덜 되었거나 또는 아직은 미완성 클래스이므로 실제 인스턴스(또는 객체)를 생성할 수 없도록 한 클래스입니다. 다시 말해서, 추상클래스는 객체가 가지는 특성들을 추상화시켜 놓았을 뿐 아직 구체화 시키지 못한 클래스이므로, 이 추상클래스를 상속하는 하위클래스에서 좀 더 구체화 시키도록 하는 것입니다. 따라서, 추상클래스를 상위클래스로 하여 상속하는 하위클래스는 추상클래스인 상위클래스에서 완전히 구현하지 못한 부분들을 완전하게 구현해 주어야만 하위클래스에 대한 객체 생성이 가능하고, 그렇지 못할 경우 하위클래스는 상위클래스인 추상클래스와 같이 미완성이므로 자체적으로 객체를 생성할 수 없고, 이 하위클래스는 다시 추상클래스가 됩니다.
추상클래스는 객체 지향 프로그램에서 하위클래스들의 공통된 특성을 추출하여 묘사하기 위한 클래스로, 클래스 자체가 너무 일반적인 특성을 가지기 때문에 객체를 생성하여 실제로 사용하기에 부적당한 클래스로, 디자인의 편의를 위해서 사용됩니다. 추상클래스의 일반적인 특성을 하위클래스에서 좀 더 덧붙여 실제 사물을 표현할 수 있기 때문에 추상클래스 그 자체로는 쓸모가 없지만 파생을 할 경우는 쓸모가 있습니다.
추상함수(abstract function)
추상클래스에는 연관된 하위클래스들의 공통데이터 구조, 즉 변수들을 정의하고, 함수중 일부는 완전히 구현하지 않고 프로토타입만 정의합니다. 이와 같이 추상클래스에는 함수 몸체가 없이 정의되는 함수를 멤버로 가지게 됩니다. 이것은 필요한 기능을 지금 당장 함수로 구현할 수 없을 때 일단 정의만 해두고 내용은 나중에(하위클래스에서) 채워넣고 사용하겠다는 의미입니다. 이러한 몸체가 없이 정의되는 함수를 C++에서는 순수가상함수(pure virtual function)라고 하고 자바에서는 추상메소드(abstract method)라고 합니다. 여기서는 앞으로 순수가상함수 또는 추상메소드를 추상함수라 통칭하겠습니다.
추상함수를 포함하고 있는 추상클래스를 상속하는 하위클래스는 추상클래스가 갖고 있는 모든 추상함수를 구현하여 주어야 합니다. 그럴 경우, 하위클래스는 일반클래스처럼 사용할 수 있고, 인스턴스의 생성도 가능하지만, 추상함수를 모두 구현해 주지 못한 경우에는 하위클래스도 구현이 완전히 이루어지지 않은 추상함수를 포함하게 되므로 추상클래스가 됩니다.
추상클래스의 예
추상클래스의 아주 좋은 예로 그래픽 화면 상의 한 좌표를 가지는 Position 클래스를 들 수 있습니다.
[code php;gutter:false] class Position {
var $px, $py;
} [/code]
이 클래스는 위치만을 가지기 때문에 어떠한 그래픽 요소도 표현할 수가 없습니다. 가장 간단한 그래픽 요소인 점조차도 색상을 지정할 능력이 없기 때문에 표현이 불가능하며 단지 위치만을 가질 뿐입니다. 하지만 이 클래스는 모든 그래픽 요소에서 공통된 요소인 위치를 가지므로 파생을 할 경우는 하위클래스 자체가 유용하게 사용될 수 있습니다. 점을 나타내는 Point 클래스를 이 클래스로부터 파생시켜 색상을 나타내는 데이터 멤버만 덧붙이면 되며 원은 색상과, 반지름을 덧붙이고, 선은 끝점의 좌표와 색상을 덧붙이면 됩니다. 그외의 다른 그래픽 요소들도 Position 클래스로부터 파생시켜 나갈 수 있습니다.
추상클래스란 이렇게 파생을 목적으로 만들어지는 부모클래스이며 추상클래스의 멤버 함수는 객체를 가지지 않기 때문에 코드를 가질 필요가 없습니다. 단 하위클래스에서 멤버 함수를 재정의(overriding)하여 쓸 수 있도록 추상함수로 멤버 함수를 정의해주기만 하면 됩니다.
추상클래스의 특징
  • 추상함수를 갖는 클래스는 자동으로 추상클래스가 됩니다. 추상클래스는 최소한 한 개 이상의 추상함수를 가져야 합니다.
  • 추상클래스로부터 인스턴스 객체를 생성할 수는 없으며, 반드시 하위클래스가 존재합니다.
  • 추상클래스의 하위클래스는 상위클래스의 추상함수를 구현해주기만 하면 해당 하위클래스의 인스턴스 객체를 생성해 줄 수 있습니다.
  • 추상클래스의 하위클래스가 추상클래스로부터 상속받은 모든 추상함수를 구현해주지 않는 한 하위클래스 자신도 추상클래스가 됩니다.

'phpclass > 객체정보' 카테고리의 다른 글

{추상클래스}6.세셔너 확장  (0) 2000.12.28
{추상클래스}5.세셔너 분석  (0) 2000.12.28
{추상클래스}4.PHP  (0) 2000.12.28
{추상클래스}3.자바  (0) 2000.12.28
{추상클래스}2.C++  (0) 2000.12.28
Posted by 방글24
애플리케이셔너 0.0.2(2001.5.30)
  • register(), unregister() 메소드를 삭제하였으며 따라서 lock(), unlock() 메소드 만으로 방문자공용변수를 제어합니다.
  • 애플리케이셔너 배열 변수 $APPL_VARS[]를 삭제하였습니다.
  • 실행속도 향상을 위해 객체 생성시 모든 방문자공용변수를 복원하던 것을 수정하여 해당 페이지에서 사용하는 변수값만 복원합니다.
애플리케이셔너 0.0.1(2000.11.21-최초 공개 버전)
  • 애플리케이셔너는 모든 방문자가 공용으로 사용할 수 있는 변수(방문자공용변수)를 사용할 수 있도록 제작된 라이브러리로, ASP의 애플리케이션 객체와 같은 역할을 합니다.

Posted by 방글24
생성자
방문자공용변수가 저장되는 장소(디렉토리 또는 디비 테이블명)를 변경할 필요가 없으면 아래와 같이 입력인자 없이 객체를 생성합니다.
[code php;gutter:false] $appl = new Applicationer;
.
.
. [/code]
파일시스템용에서 저장되는 디렉토리를 변경하려면 아래와 같이 생성자의 입력인자인 배열의 요소 "resource"에 디렉토리명을 지정하십시요.
[code php;gutter:false] require("./class.applfile.php");

$argv["resource"] = "새로운 디렉토리명";
$appl = new Applicationer($argv);
.
.
. [/code]
데이터베이스용에서 저장되는 테이블을 변경하려면 아래와 같이 생성자의 입력인자인 배열의 요소 "resource"에 테이블명을 지정하십시요.
[code php;gutter:false] require("./class.applbase.php");

$argv["resource"] = "새로운 테이블명";
$appl = new Applicationer($argv);
.
.
. [/code]
사용자 메소드
bool lock(string varlist | array varlist);
lock() 메소드에 전달되는 방문자공용변수 중에 아직 등록되지 않은 변수가 있으면 lock() 메소드 내부에서 자동적으로 등록시켜 줍니다. 반대로 방문자공용변수에 할당된 값이 null이면 등록을 취소(해당 변수에 대한 모든 정보를 삭제함)합니다. 이 함수의 역할은 다른 방문자가 지정된 변수를 조작할 수 없도록 막아줍니다. lock() 메소드로 지정된 방문자공용변수는 오직 lock() 시킨 문서에서만 그 값을 수정할 수 있습니다. 다른 방문자(다른 웹문서)에서 해당 변수를 사용할 수 있도록 하기 위해서는 unlock() 메소드로 풀어주어야 합니다.
[code php;gutter:false] $appl->lock("counter");

if (!$appl->counter)
$appl->counter = 100; // 100부터 카운팅 시작

$appl->counter++;

$appl->unlock("counter"); [/code]
복수의 방문자공용변수를 lock, unlock 하려면 배열을 이용하여 전달합니다.
[code php;gutter:false] $appl->lock(array("counter", "stock"));
.
.
.
$appl->unlock(array("counter", "stock")); [/code]
bool unlock(string varlist | array varlist);
다른 방문자가 lock() 으로 지정된 변수를 조작할 수 있도록 하기 위해 lock를 풀어주는 메소드입니다. 만약 unlock에서 지정된 변수의 값이 빈문자열이면 더 이상 필요없는 변수라고 판단하여 파일 또는 디비에 등록되어 있는 변수를 완전히 삭제시켜 줍니다.
사용 예제
첨부된 사용예제(파일명 test.php3)는 세션함수를 이용하기 때문에 만약 PHP3에서 실험하기위해서는 제가 공개한 세셔너를 추가로 다운로드 받아 같은 디렉토리에 복사하여야 합니다. 그리고 디비용 애플리케이셔너를 실험하기 위해서는 미니디비 0.2.2p1 버전이 필요하니 이것도 필요하면 다운로드하여 같은 디렉토리에 복사하여야 합니다.

Posted by 방글24