비공개 멤버 변수(Private Members Variable)
접근 권한(Access Right)
C++ 또는 자바와 같은 객체지향 프로그래밍 언어에는 멤버에 대한 접근 권한을 지정하는 public, protected, private라는 접근지정자(또는 접근제한자,접근변경자)가 있습니다. 여러분이 작성하고자 하는 코드를 더 잘 캡슐화하기 위하여 접근지정자를 통해 멤버(메소드 및 변수)에 대한 접근을 제어하는 것입니다.
private : 자신 클래스 안에서만 접근할 수 있으며 하위 클래스에서는 접근할 수 없다.
protected : 자신 클래스 및 하위 클래스에서만 접근할 수 있다.
public : 모든 클래스에서 접근할 수 있다.
protected : 자신 클래스 및 하위 클래스에서만 접근할 수 있다.
public : 모든 클래스에서 접근할 수 있다.
C++ 이냐 자바냐에 따라 그 의미가 약간씩 다르기도 하고 추가되는 개념도 있습니다. 가장 큰 차이점은 protected 접근지정자로 C++에서는 바로 아래에 있는 하위 클래스에서만 접근할 수 있는 반면에 자바에서는 패키지라는 개념이 도입되어 패키지 안에 있는 어떤 클래스도 접근할 수 있게 해 줍니다.
PHP에서의 접근 권한 지정
Zend 엔진 1.0에서는 멤버변수를 정의할 때 아래와 같이 var 키워드를 이용하게 됩니다. 이와 같이 접근지정자를 별도로 지정할 수 없으며 무조건 public 특성을 가지게 됩니다.
[code php;gutter:false]
var $member;
[/code]
Zend 엔진 2.0에서 추가된 키워드인 static으로 지정된 정적멤버변수의 경우에도 public 특성을 가지기 때문에 외부클래스에서 자유롭게 접근할 수 있습니다.
[code php;gutter:false]
static $static_member;
[/code]
앞서 작성된 "클래스를 사용해야하나?(부제:클래스를 이용한 모듈화 프로그래밍)"라는 글에서함수 내부의 정보를 숨기기위한 모듈화를 소개하면서 같은 개념으로 객체 수행의 내부 동작을 숨기기 위한 캡슐화를 살짝 언급하였었지요. 이러한 캡슐화를 통해 정의된 인터페이스를 통해서만 객체 내부에 접근하도록 허용하는 것입니다.
함수의 모듈화를 위해 전역변수가 아닌 지역변수가 요구되듯이 클래스의 캡슐화를 위해서는 public이 아닌 자신의 클래스 내에서만 접근할 수 있는 private라는 접근지정자가 절실히 요구되지요.
Zend 엔진 2.0에서는 접근지정자 private를 추가하여 캡슐화 도구로써 진일보하게 되었습니다. 멤버변수를 private로 지정하게 되면 멤버변수가 선언된 클래스 외부에서는 이 멤버 변수에 절대로 접근할 수가 없게 됩니다.
[code php;gutter:false]
<?php
class MyClass {
private $Hello ="Hello, World! \n";
function printHello() {
print $this->Hello;
}
}
class MyClass2 extends MyClass {
function printHello() {
MyClass::printHello(); /* Should print */
print $this->Hello; /* Shouldn't print out anything */
}
}
$obj = new MyClass();
print $obj->Hello; /* Shouldn't print out anything */
$obj->printHello(); /* Should print */
$obj = new MyClass2();
print $obj->Hello; /* Shouldn't print out anything */
$obj->printHello();
?> [/code]
class MyClass {
private $Hello ="Hello, World! \n";
function printHello() {
print $this->Hello;
}
}
class MyClass2 extends MyClass {
function printHello() {
MyClass::printHello(); /* Should print */
print $this->Hello; /* Shouldn't print out anything */
}
}
$obj = new MyClass();
print $obj->Hello; /* Shouldn't print out anything */
$obj->printHello(); /* Should print */
$obj = new MyClass2();
print $obj->Hello; /* Shouldn't print out anything */
$obj->printHello();
?> [/code]
'phpclass > 객체모델' 카테고리의 다른 글
{Zend 엔진 2.0 설계초안}06.소멸자 (0) | 2002.12.21 |
---|---|
{Zend 엔진 2.0 설계초안}05.단일화된 생성자 (0) | 2002.12.21 |
{Zend 엔진 2.0 설계초안}03.static 멤버 변수 (0) | 2002.12.21 |
{Zend 엔진 2.0 설계초안}02.개선된 객체모델 (0) | 2002.12.21 |
{Zend 엔진 2.0 설계초안}01.개요 (0) | 2002.12.21 |