모듈화 프로그래밍에서 우리는 함수를 이용하여 모듈화를 할 수 있다는 것을 알았습니다. 그런데 함수를 이용한 모듈화에는 한계가 있습니다. 하나의 함수 내에서 사용할 변수는 얼마든지 정의하여 사용할 수 있습니다. 즉 지역변수지요. 그런데 만약 2개 이상의 함수에서 공유해야 할 변수가 필요하다면 어떻게 할까요. 전역변수 외에는 방법이 없지요. 그런데 모듈화의 개념이 무엇이라고 앞에서 말씀드렸지요? 바로 블랙박스입니다. 블랙박스 안의 내용은 절대로 불법적(함수를 통한 정상적인 방법으로 접근하지 않는 것을 의미)으로 접근되어서는 안됩니다. 그런데 2개 이상의 함수에서 공유해야할 변수로 전역변수를 이용한다면 이 전역변수는 공유하고 있는 2개 이상의 함수 이외의 곳에서도 얼마든지 접근이 가능하지요. 모듈화 개념에서 벗어나는 것이지요.
아래와 같은 함수가 있다고 가정하지요. 왜 이렇게 작성했는가는 따지지 마세요. 설명하기 위한 것이니까요.
여기에서 $str은 함수 내에서만 사용할 수 있는 지역변수(local variable)입니다. $str 값은 get_string() 함수의 리턴값으로만 반환받을 수 있지 다른 방법으로는 접근할 수가 없습니다. 따라서 이 함수는 모듈화 개념에 맞게 잘 작성된 것입니다.
[code php;gutter:false]
function get_string() {
$str = "1234567890";
return $str;
} [/code]
$str = "1234567890";
return $str;
} [/code]
이것을 몇 개의 함수를 이용하여 문자열 자르기를 위한 라이브러리로 확장시켜보지요.
[code php;gutter:false]
/*
문자열 자르기를 위한 라이브러리(일반 함수를 이용할 때)
*/
$bank;
function get_string() {
global $bank;
return $bank;
}
function set_string($str) {
global $bank;
$bank = $str;
}
function cut_string($len) {
global $bank;
$bank = substr($bank, 0, $len);
}
set_string("1234567890");
cut_string(4);
echo get_string(); // "1234"가 출력되겠지요. [/code]
문자열 자르기를 위한 라이브러리(일반 함수를 이용할 때)
*/
$bank;
function get_string() {
global $bank;
return $bank;
}
function set_string($str) {
global $bank;
$bank = $str;
}
function cut_string($len) {
global $bank;
$bank = substr($bank, 0, $len);
}
set_string("1234567890");
cut_string(4);
echo get_string(); // "1234"가 출력되겠지요. [/code]
set_string() 함수를 이용하여 자르고자 하는 문자열을 지정하고, cut_string() 함수를 이용하여 자를 문자열 길이를 지정하여 자르고, get_string() 함수를 이용하여 자른 문자열을 돌려받습니다.
이와 같이 문자열 자르기를 위하여 몇 개의 함수를 모아서 라이브러리화 시켰더니 모든 함수가 공유해야할 $bank 변수가 필요해 졌습니다.
이렇게 작성된 문자열 자르기 라이브러리를 볼 때 모듈화 관점에서 문제점이 무엇입니까? 앞에서도 언급하였듯이 모듈화가 되려면 함수명, 입력값, 출력값 외에는 외부세계에서 접근이 불가능해야 합니다. 그런데 $bank 변수가 전역변수(global variable)로 사용되다보니 문자열 자르기 라이브러리 외의 어느 곳에서도 쉽게 접근할 수 있는 화이트박스(?)가 되어 버렸지요.
이것이 함수를 이용한 모듈화의 한계입니다. 2개 이상의 함수에서 공유해야할 변수를 블랙박스 내에 담을 수 있는 도구가 바로 클래스입니다. 클래스라는 도구를 통해 모듈화가 보다 완전해 지는 것이지요.
[code php;gutter:false]
/*
문자열 자르기를 위한 라이브러리(클래스를 이용할 때)
*/
class string {
var $bank;
function get() {
return $this->bank;
}
function set($str) {
$this->bank = $str;
}
function cut($len) {
$this->bank = substr($this->bank, 0, $len);
}
}
$string = & new string; // 객체 $string의 생성
$string->set("1234567890");
$string->cut(4);
echo $string->get(); // "1234"가 출력되겠지요. [/code]
문자열 자르기를 위한 라이브러리(클래스를 이용할 때)
*/
class string {
var $bank;
function get() {
return $this->bank;
}
function set($str) {
$this->bank = $str;
}
function cut($len) {
$this->bank = substr($this->bank, 0, $len);
}
}
$string = & new string; // 객체 $string의 생성
$string->set("1234567890");
$string->cut(4);
echo $string->get(); // "1234"가 출력되겠지요. [/code]
[주의] PHP 와 C++ 언어에서 클래스를 이용할 때의 모듈화의 완전성을 비교해 볼 때 PHP의 모듈화는 다소 덜 완전합니다. 즉, C++에서는 액세스 권한(access right) 지정자 private를 이용하면 클래스 외부 세계에서는 해당 변수에 절대로 접근할 수 없으나 PHP에서는 아직 액세스 권한 지정자 개념이 도입되지 않았기때문에 객체를 통하여 변수에 접근할 수가 있습니다. 그러나 역시 객체를 통하지 않고는 접근할 수 없다는 면에서 볼 때 일반 함수를 통한 모듈화보다는 훨씬 뛰어난 모듈화 성능을 보여주고 있습니다.
[참고] PHP 가 아닌 C++ 또는 java와 같은 객체지향 프로그래밍에서의 변수의 사용범위는 더욱 다양합니다. 다른 말로하면 복잡하다는 말이기도 하지요. public, private, protected와 같은 액세스 권한 지정자에 의해 클래스 내에서의 사용범위를 조절할 수 있습니다.
'phpclass > 클래스활용' 카테고리의 다른 글
{클래스를 사용해야 하나}6.결론 (0) | 2002.09.13 |
---|---|
{클래스를 사용해야 하나}5.이름공간(namespace) (0) | 2002.09.13 |
{클래스를 사용해야 하나}3.블랙박스 (0) | 2002.09.13 |
{클래스를 사용해야 하나}2.모듈화 프로그래밍 (0) | 2002.09.13 |
{클래스를 사용해야 하나}1.개요 (0) | 2002.09.13 |