PHP class 정리 본문

PHP

PHP class 정리

원문/출처:

http://smartjuho.tistory.com/entry/PHP-class-%EC%A0%95%EB%A6%AC





PHP는 OOP(Object Oriented Programming) 즉 객체지향 프로그래밍 언어로써 class 사용이 가능합니다. 그 사용법이나 쓰임새는 JAVA의 그것과 매우 흡사하여 JAVA를 공부하신 분들은 쉽게 익히실 수 있습니다. 그럼 지금부터 class 사용법을 간략히 알아보겠습니다.

 

1. class 선언

class aaa{ //함수를 정의하는 것과 같은 방식으로 class를 선언합니다. 다만, 선언된 class로 객체를 만들면 독립적으로 활동하므로 함수의 인자와 같은것은 없습니다.

 

var $aaa_mv; //맴버변수(member variable) 정의합니다. class 안에서 정의된 변수를 맴버변수라고 합니다.

 

function aaa1(){ //메서드(method) 정의합니다. class 안에서 정의된 함수를 메서드라고 합니다.

     echo "class선언";

}

 

}

 

$aaa_rv = new aaa; //메모리상에 인스턴스(객체)를 생성하기 위해서는 new 연산자를 이용해서 명시적으로 생성을 해주어야 합니다. 이렇게 생성된 인스턴스를 가리키는 변수가 레퍼런스 변수(Reference Variable)입니다. 그렇다면 class 만 정의 하면 되지, 인스턴스 생성은 왜 필요한가? 이것은 class 자체는 객체를 정의한 것에 불과하고, 실제로 사용되기 위해서는 메모리상에 올라와야 하기 때문입니다. 그리고 여기서 절대 혼동해서 안되는 것은 레퍼런스 변수인 $rv 는 그 자체로 객체가 아니라 인스턴스 즉, 객체를 가리키는 역할만 한다는 것입니다.

$aaa_rv -> aaa1(); //연산자 -> 를 사용하여 위에서 정의한 aaa1()를 호출합니다. JAVA에서는 '레퍼런스변수.메서드' 로 사용합니다. 여기서 '.' 이 PHP에서는 '->' 입니다.

 

*앞으로 '인스턴스'와 '객체'는 같은 뜻으로 혼용하여 사용하겠습니다.

 

2. $this(의사-변수)

class aaa{  

 

var $aaa_mv;  

 

function aaa1(){

echo $this->aaa_mv; //$this는 aaa의 인스턴스 즉, 자신을 가리킵니다. class 밖에서는 레퍼런스 변수를 사용해서 인스턴스에 접근하고 class 안에서는 $this로 인스턴스에 접근합니다.

}

 

}

 

$rv = new aaa;

$rv -> aaa_mv = "의사-변수"; //레퍼런스 변수를 이용하여 맴버변수에 접근하는 방법입니다. JAVA에서는 '레퍼런스변수.맴버변수' 로 사용합니다. 여기서 '.' 이 PHP에서는 '->' 입니다.

$rv -> aaa1();


*맴버변수를 선언하지 않고 의사-변수에 바로 값을 넣고 사용해도 문제가 발생하지 않으나 올바른 방법은 아닙니다.

 

3. ::(영역 해결 연산자)

class aaa{  

 

var $aaa_mv = "영역 해결 연산자"; 

 

function aaa1(){

echo "영역 해결 연산자";

}

 

}

 

aaa :: aaa1(); //영역 해결 연산자 '::' 는 new연산자로 인스턴스를 생성하지 않은 상태에서 class 자체의 함수를 사용하고 싶을 때 사용합니다. 그리고 class 함수는 존재하지만, class 변수는 존재하지 않습니다. 왜냐하면 인스턴스가 생성되지 않았기 때문에 의사-변수 $this 로 class 변수 즉, 맴버변수에 접근할 수 없기 때문입니다. 하지만 맴버변수 정의시 static을 주면 전역변수가 되어서 aaa :: $aaa_mv; 와 같이 사용할 수 있다.

 

4. extends(상속) // 상속이란 이미 만들어진 class(상위class)의 기능을 그대로 물려받는 새로운 class(하위class)를 만들고 싶을 때 사용합니다. 상위class를 그대로 물려받은 상태에서 맴버변수와 메소드를 조금 더 추가하여 하위class를 만듭니다.

class aaa{ //상위class 선언

 

var $aaa_mv; 

function aaa1(){

echo "aaa";

}

 

}

 

class bbb extends aaa{ //하위class 선언

 

var $bbb_mv; 

function bbb1(){

echo "bbb";

}

 

}

 

$bbb_rv = new bbb;

$bbb_rv -> aaa1(); //class bbb는 class aaa로 부터 상속 받았기에 레퍼런스변수 $bbb_rv로 class aaa의 aaa1() 함수를 호출할 수 있습니다. 

 

5. Method Overring(메서드 오버라이딩) // 상속받은 하위class는 상위class의 메서드에 접근할 수 있습니다. 그런데 하위class에서 메서드의 이름은 같지만 동작은 다르게 해야 할 경우는 어떻게 해야 할까요? 이때 메서드 오버라이딩을 사용합니다. 지금부터 사용방법을 설명하겠습니다. 일단 하위class에 사용하고자 하는 상위class의 메소드의 이름과 똑같이 정의 합니다. 그 안에 기능만 바꾸만 메서드 호출시 하위class에서 정의된 기능으로 구현됩니다.

class A {


function example() { //하위class의 메서드 이름과 같습니다.
echo "aaa";
}


}

class B extends A {


function example() { //상위class의 메서드 이름과 같습니다.
echo "bbb";
}


}

 

$b = new B;
$b->example(); //상위class와 하위class 모두 example()라는 같은 메서드를 가지고 있지만 여기서 메서드 오버라이딩되어서 하위class의 메서드가 구현됩니다.

 

*상위,하위class 메소드 작성시 인자는 될 수 있으면 같아야 합니다. (JAVA와는 달리 인자가 다르더라도 에러는 발생하지는 않습니다만) 하지만, 메서드를 호출할 때 하위class의 인자와 같아야 합니다. 예를 들어 위의 하위class가 fuction example($var){ 로 정의 되어 있다면 메서드 호출시에도 $b->example("인자 값"); 와 같이 인자개수를 맞추어야 합니다. (메서드 호출시 보내는 인자개수는 하위class에서 작성된 인자개수보다 많아도 에러가 발생하지 않지만, 그 반대가 되면 에러가 발생하므로 유의하시기 바랍니다.)


*JAVA에서의 Method Overloading(메서드 오버로딩)의 개념은 PHP에 없습니다. Cannot redeclare 라고 에러가 발생합니다.

 

6. 메서드 오버라이딩 구현시 상위class 메서드에 접근하기 위한 parent 사용 //하위class에서 메서드 오버라이딩을 해주게 되면, 상위 클래서의 해당 메서드의 직접적인 호출이 불가능합니다. 하지만 오버라이딩된 상위class의 메서드를 호출해야 하는 경우가 종종 있습니다. 이렇게 상위class에 접근하기 위해서 parent를 사용합니다. parent를 사용하면 상위class 명을 사용하는 것을 피할 수 있습니다. 그리고 parent를 메서드 오버라이딩이 아니더라도 상위class에 접근하기 위한 방법으로 사용할 수 있으나, 그때는 $this->메서드 와 같이 사용하면 됨에 따라 굳이 parent를 사용할 필요는 없습니다.

class A {


function example() { //하위class의 메서드 이름과 같습니다.
echo "aaa";
}


}

class B extends A {


function example() { //상위class의 메서드 이름과 같습니다.
parent::example(); //상위class인 A는 인스턴스가 생성되지 않았기 때문에 인스턴스로 접근할 방법이 없습니다. 따라서 영역 해결 연산자'::'를 사용합니다. parent는 JAVA에서 super와 비슷한 역할을 한다고 볼 수 있습니다.

}


}

 

$b = new B;
$b->example(); //메서드 오버라이딩이된 하위class의 메서드가 구현되지만, 그 메서드가 다시 상위class 메서드를 구현하여 "aaa"이 출력됩니다.

 

7. 맴버변수 상수가 아닌 값으로 초기화

class aaa{  

 

 var $aaa_mv = "상수"; //이렇게 맴버변수 선언시 바로 값을 주면 상수로 초기화 됩니다.

 

function aaa1(){

echo $this->aaa_mv;

}

 

}

 

$rv = new aaa;

$rv -> aaa_mv = "상수가 아닌 값"; //이렇게 맴버변수를 먼저 선언하고 따로 값을 주면 상수가 아닌 값으로 초기화 됩니다.

$rv -> aaa1();

 

8. 접근 제어자

public : 아무 객체나 접근가능

protected : 상속 관계까지 접근가능

private : 외부 객체 접근불가

*var는 variable의 약자로 단지, 일반적으로 맴버변수를 정의 할때 사용하는 default입니다. 접근제어자 측면에서의 그 기능은 public과 비슷하다고 할 수 있으나 완전히 같지는 않습니다. PHP5 로 가면서 class기능이 더욱 강화되었고 그러므로 앞으로는 var보다 위의 정확한 접근 제어자를 주는 것이 유익합니다.

 

class A {
 
protected $a = "접근제어자"; //protected 로 맴버변수 정의


}

 

class B extends A {
 
function example() {
echo $this->a; //protected 는 상속관계까지 접근을 허용함으로 출력이 됩니다.
}


}

 

$b = new B;
$b->example();
echo $b->a; //외부에서 호출을 하고 있으므로 에러가 발생한다. 이때 상위class의 맴버변수를 public으로 선언하면 출력이 됩니다.

 

PHP Related Articles

MORE