티스토리 뷰

프로그래밍/PHP

php의 oop 지원형태

프링글 2008. 6. 17. 18:50

php4에서는 단일 상속과 몇가지에 대한 지원밖에는 해주지 못했지만.. php5에서는 자바의 객체지향 모델을 가지고 옴으로써 여러가지를 지원해주게 됩니다.


  1. 상속

여전히 상속은 단일 상속만을 지원합니다.

하지만 interface 개념을 도입함으로써 여러가지로 작동하는 원리로 만들어줍니다. interface는 다중상속을 위해서 나온 것은 아닙니다. 그러니 다중상속 개념은 없다고 보는것이 맞겠지요...


2. 인터페이스  

     php5에서는 interface 개념을 지원합니다. interface는 다른 객체와 잘 부합할 수 있도록 객체의 표준을 마련하는 것이라 보면 쉽겠습니다.


3.  추상 클래스

    인터페이스와 비슷한 개념으로 추상클래스를 지원합니다. 하지만 추상클래스와 인터페이스의 용도는 좀 다르죠.. 일단 클래스이기 때문에 상속은 단일 상속밖에 할 수 없습니다. 그리고 추상메소드를 정의를 해야하고 abstract 라는 키워드를 써서 추상클래스임을 명시해야합니다. 일단 설계하는 클래스가 여러가지로 몇가지 기능을 빼고는 다 같은 방식으로 작동이 된다면 추상클래스는 아주 좋은 선택이 될 수도 있습니다.


  •  php5에서는 추상 클래스에서 인터페이스를 구현(implements) 하면 인터페이스에 속해 있는 메소드들은 무조건 실제 작동하는 메소드로 생성이 되어야 합니다. 하지만 자바에서는 인터페이스 메소드들도 그대로 추상메소드로 되어질 수 있습니다. 이것이 조금 번거로울 수도 있겠네요.

예를 들어서   java 는

interface A { public void a();}

abstract class B implements A { abstract public void a(); }


php는


interface A { public function a(); }

abstract class B implements A { public function a() { echo "aaa"; } }


위의 예제와 같이 java는 interface의 메소드(추상메소드이지요)는 추상클래스내에서 다시 추상메소드가 될 수 있지만 php는 반드시 구현되어야 하는 메소드가 되버립니다.


4.  오버로딩(Overloading), 오버라이딩 (Overriding)

오버로딩은 같은 클래스 내에서 이미 정의해 놓은 메소드를 같은 의미이지만 다른 매개변수를 사용 할 때 같은 이름의 메소드를 정의 할 수있게 해주는 것을 말합니다.

오버라이딩은 상속관계에서 같은 메소드이지만 다른 내용으로 만들고 싶을 때 메소드를 재정의 하는 것을 말합니다.

  php5 에서 사용하는 방법은 조금 신기합니다. ㅋㅋ

     일단 오버라이딩은 자동으로 됩니다... php에서는 같은 이름의 함수가 있으면 가장 마지막에 선언이 되어진 함수로 실행을 하기 때문에 오버라이딩은 자동으로 되게 되어있습니다. 그렇다면 오버로딩은 어떨까요?


     php5 에서는 몇가지 매직함수를 지원하는데요.. 그중에서 __call 이라는 놈이 재미난 놈입니다...

     이놈은 선언 되어지지 않은 메소드가 실행이 될때 실행되어지는 메소드 입니다.


     예를 들어서


     class AAA   {

          function run() {

 echo "뛰어";

          }

}


$a = new AAA();

$a->run();


   일반적으로는 이렇게 실행을 하는데요....


   $a->run_to("진호");


      이런식으로 선언되어지지 않은 메소드를 사용하면 __call 이 자동으로 불리어집니다. ㅋㅋ 오~~ 여기서 부터 재밌습니다.

      그럼 __call은 어떻게 쓰느냐... ㅋ


     class AAA   {

          function run() {

 echo "뛰어";

          }


function __call($func, $args) {

     echo "함수 : ", $func, ", 매개변수 리스트 ", implode(",", $args) ;

   }

}

   

      이런식으로 __call 은 메소드 이름과 매개변수 리스트를 배열로 받아들인다. ㅋㅋ  자 이간단한 개념을 가지고 살짝 재밌는 기능을 구상해 보자.


     요즘 웹프레임워크 중에 제일 잘 나가고 있는 루비의 일부 기능을 흉내내보겠당... 루비는 메타프로그래밍이 가능한 아주 유연한 언어이다.

    실행중에 클래스 메소드 자체를 마음대로 바꾸어 줄 수 있다. 그런 기능을 이용해서 레일스에서는 액티브 레코드에 여러가지 기능을 넣어두었다.


    예를 들어


  obj.find_by_name("진호")     --- name 필드가 진호인 것을 찾는다.


     여기서 주의깊게 봐야할 부분이 name 부분인데 이것은 필드 이름인데 언제 어디서든 바뀔 수가 있답니다. 그렇다면 메소드가 동적으로바뀐다는 말이되겠군요..

     어! 메소드가 동적으로 바뀌네 하면 php에서는 __call 을 떠올리세요. ㅋㅋ


    function __call($func, $args) {

       if (strpos($func, "find_by_") == 0) {

             // 자 이제 메소드에서 나머지 부분만 때어 볼까요?

            $arr = explode("find_by_", $func);

         $field = $arr[1];      // 이렇게 하면 필드 이름이 나오겠네요.. 오호~~

            $value = $args[0];   // 이렇게 하면 검색 하는 값이 나오겠네요. .오.. 정말..


           //  오 쉽게 select 구문이 되네요.. ㅋ

           $sql = "select * from 테이블 where {$field} = '{$value}' ";


           // 나머지는 상상에 맡길게요.. ㅋ

       }

    }


    제가 여기서 말하고자 하는 것은 php5 오면서 상당히 유연해졌다는 것입니다. 그리고 pecl에 있는 라이브러리 중에서는 실행시간 중에도 php의 메소드를 바꿔주는 메소드도 있습니다.. 즉 메타프로그래밍이 된다는 거죠.... ^^


    앞으로도 php는 발전 가능성이 너무 많네요.... ㅋ


5. 다형성

    다형성이라는 말은 여러가지로 해석이 될 수 있는데요,,,  하나의 자료형에 여러가지 다른 자료형을 넣을 수 있느냐는 것과 서로 유사한 클래스들을 하나의 인터페이스로서 제어 할 수 있느냐는 것도 다형성 중에 하나의 요소가 됩니다.   이것에 대해서는 php는 왕이죠.. 거의..  (필자가 생각하기에는.. ㅋㅋ )


    array  하나로 모든 것을 저장하고 내 뱉고 검색 할 수 있답니다.. 심지어는 array_multi_sort 라는 함수를 이용하면 db 에 있는 데이타를 가지고 와서 배열에 담아두고 그 자체로 다시 정렬 할 수 있습니다. 그래서 php는 기본적으로 다형성을 가지고 시작을 합니다. 모든 자료형은 동적으로 생성이 됩니다. 스크립트 언어들의 거의 기본적인 특징이죠... 그래서 좀 더 유연하고 쉽고 빠르게 프로그래밍을 배울 수 있답니다. 하지만 쉽다는 것이 곧 아무나 한다는 의미는 아니니 명심하세요...


6. 동적 바인딩

 동적 바인딩은  실행시간에 실제 그 객체의 메소드를 정확하게 찾아서 메소드를 실행 시키는 방법입니다. 이 말은 C++이나 자바에서 많이 접할 수 있는데요...

 C++이나 자바는 미리 클래스를 선언해주고 변수에 객체를 할당합니다. 그래서 그 클래스 변수에는 딱 정해진 자료형으로만 사용되어지는데요...

 그래서 인터페이스나 추상클래스를 두고 실제 움직이는 메소드에 대해서는 다른 클래스에 맡겨 두는 방식이 됩니다. 그렇게 되면 여러 클래스들이 인터페이스나 추상클래스 앞으로 모일 수가 있답니다. 즉 인터페이스와 추상클래스를 가지고 다른 클래스들을 공통적인 방법으로 실행하지만 실제 실행되는건 인터페이스나 추상클래스가 아닌 실제 그것을 구현한 클래스에 들어있는 메소드라는 것입니다.. 자기 자신을 아는 것이죠...


   하지만 php는 애초에 자료형을 지정해줄 필요가 없답니다. 그래서 지금 내가 할당되어진 객체 그 자체로 실행을 하기 때문에 언제든 동적 바인딩이 된다고 볼수가 있답니다. 그러니 좀 더 편하게 프로그래밍을 할 수 있답니다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크