PHP

8.1 클래스

클래스는 일련의 변수와 이 변수들을 사용하는 함수들의 모음이다. 클래스는 아래와 같은 형태로 선언된다. Class 문장은 Java 의 subset이라 할 마큼 동일하다.

 

객체란 우리가 살고 있는 현실 세계는 모두 객체로 구성되어 있다. 예를 들어 사람, 집, 자동차, 컴퓨처 등 현실 세계에서 볼 수 있는 모든 것은 객체이다. 이 객체는 “속성” 과 “행위”를 갖고 있다. 예를 들어 사람이라는 객체는 이름, 성별, 주민등록번호 등의 속성과 밥을 먹는다, 걸어간다, 운전하다 등의 행위를 갖고 있다. OOP 에서는 속성을 멤버 변수, 행위를 메소드 또는 멤버 함수라고도 한다.

 

클래스를 정의한다는 것은 객체의 속성과 객체의 작동을 위한 메소드를 제공하는 것이다. 변수에 어떤 값을 저장할 수 있듯이 속성에서도 어떤 값을 저장할 수 있다. 또한 함수가 특정 기능을 갖고 있듯이 메소드도 작동을 위해 필요하다. 클래스의 구조는 아래와 같다.

class 클래스이름{

  변수 선언 (속성)

  함수 선언(메소드)

 

}

 

클래스 이름은 변수명 생성 규칙과 동일하다.

 

다음 예제는 학생의 신상을 클래스 student으로 정의하고 속성으로 변수 4개 (학번, 이름, 주민등록번호, 출생년도)를 선언하였다. 변수 선언을 위하여 변수 앞에 var을 명시해야 한다. 메소드는 신상 데이터를 입력하는 input() 함수로 만들어 주었다. 메소드 안의 속성에 접근하기 위하여 $this 변수를 사용해야 하고, $this는 객체 자신을 가리키는 변수(인스턴스)이며 접근한다는 의미에서 ->를 사용해야 한다.

 

$this -> stu_no =$in_stu_no

 

$this->stu_no 의미는 “객체의 학번 속성에 접근한다‘ 라고 해석할 수 있다. 다음은 속성들을 담을 메모리를 할당하기 위하여 객체를 생성하고, 객체를 생성 후 속성과 메소드를 사용할 수 있다. 다음과 같이 키워드 new 는 객체를 생성한다.

 

 

 

$sinsang = new student;

객체명      클래스이름

 

 

위와 같이 객체($sinsang)를 생성했다면 $sinsang 객체를 가지고 해당 클래스의 속성과 메소드를 사용할 수 있다. $sinsang 객체를 가지고 input() 메소드를 접근은 $sinsang->input() 와 같이 사용할 수 있다.

 

<?php

  class student{

  

      var $stu_no

      var $name

      var $id_num

      var $birth_year

      function input($in_stu_no, $in_name, $in_id_num, $in_birth_year){

             $this->stu_no=$in_stu_no;

             $this->name=$in_name;

             $this->id_num=$in_id_num;

             $this->birth_year=$in_birth_year;

     }

  }

  

  $sinsang =new student;

  $sinsang->input(“2013001”, “홍길동”, “801224-123567”, “1980”);

  echo “학번 : $sinsang->stu_no, 성명 : $sinsang->name <br>”

  echo “주민등록번호 :$sinsang->id_num, 출생년도 :$sinsang->birth_year <br>”

  

?>

->출력

학번 : 2013001, 성명 : 홍길동
주민등록번호 :801224-123567, 출생년도 :1980

 

php 에서는 변수를 선언할때 형을 선언하지 않는데요.

php 코드를 보면 var 키워드를 사용할때가 있습니다.

그때는 바로 ” 클래스 변수선언 “

 

 

예제)

 

class Member {

var id;

var pass;

var name;

function add(){
……..

}

}

이런 식으로 사용됩니다.

 

8.2 생성자(Constructor)

 

생성자는 해당 클래스의 새 인스턴스(새로 만든 변수라고 생각해 두자)를 만들 때 자동적으로 실행되는 함수를 의미한다. 생성자는 객체 생성 시 호출되어 객체의 속성을 초기화하는데 사용된다. 생성자를 사용하기 위하여 클래스 이름과 같은 이름의 함수가 생성자가 된다.

다음은 클래스 손수레(cart) 에 대한 속성과 메소드 예제이다.

 

<?php

class Cart {

   var $item                                      // 변수(속성) 선언

   var $item_num

    function Cart($art_name=“과일”, $art_num=“20”) {   // Cart 생성자 정의

         $this->item = $art_name;

         $this->item_num = $art_num;

    }

    function output () {                              // 출력 기능 메소드

          echo “$this->item : $this->item_num 박스 <br>”   

    }

 }

class  name_Cart extends Cart {   // Cart  클래스를 상속 받은 name_cart 클래스

    var $owner

    function set_owner($name) {    

         $this->owner = $name;

    }

 }

class  add_Cart extends Cart {    // Cart  클래스를 상속 받은 add_cart 클래스

    function add_num($num) {    

         $this->item_num = $this->item_num + $num;

    }

 }

 $info_cart = new Cart;             // $info_cart 객체 생성

 $info_cart->Cart();                 // 생성자로 객체 초기화

echo “info_cart ==> “      $info_cart-> output();

 

 $name_cart = new name_Cart;       // $name_cart 객체 생성

 $name_cart->set_owner(“홍길동”);    // 이름 객체 초기화

echo “name_cart ==> 카트 주인 이름 : “  echo “$name_cart->owner <br>”

 

 $add_cart = new add_Cart;          // $add_cart 객체 생성

 $add_cart->add_num(5);             // 20 + 5

echo “add_cart ==> “     $add_cart->output();

 

 $default_Cart = new add_Cart;       // $default_cart 객체 생성

 $default_Cart->add_num(30);         // 20 + 30

echo “default_cart ==> “ $default_Cart->output();

?>

->출력

info_cart ==> 과일 : 20 박스
name_cart ==> 카트 주인 이름 : 홍길동
add_cart ==> 과일 : 25 박스
default_cart ==> 과일 : 50 박스

 

위의 예제에서 클래스 Cart 에는 속성 값으로 과일의 종류를 $item, 과일의 박스 수를 $item_num으로 변수 선언하고, Cart()함수의 속성 값을 초기화하여 생성자를 생성하였다.

 

add_Cart()함수를 정의하여 사과 박스를 가산하는 메소드를 생성하고, sub_Cart() 함수를 정의하여 사과 박스를 감산하는 메소드를 생성하였다. output() 함수를 정의하여 출력기능을 하는 메소드를 생성하였다.

 

8.3 상속 (inheritance)

 

OOP를 더욱 유동적이고 추상적으로 만들어주는 것은 상속의 개념이 존재하기 때문이다.

상속이란 말 그대로 어떤 값을 물려받는 다는 말이다. 즉, 하나의 클래스에서 다른 클래스로 속성과 메소드를 상속해 줄 수 있다. 상속관계를 나타내기 위하여 확장한다는 의미의 extends를 사용한다. 이런 상속 기능을 이용하여 코드를 재사용할 수 있고 새로운 기능을 첨가하여 유용하게 사용할 수 있다.

 

class 자식 (파생)클래스이름 extends 부모(기본) 클래스 이름 {

    변수 선언(속성)

    함수 선언(메소드)

}

 

클래스는 다른 클래스로 확장 될 수 있다. 확장 혹은 파생된(extended or derived)클래스는 기본(base) 클래스의 모든 변수들과 함수들을 그대로 가지게 되고, 여기에 추가로 화장된 선언을 할 수 있다. 이를 위해 “extends”라는 키워드가 사용된다.

 

다음 예제 “inheritance.php”는 “constructor.php”를 상속 개념을 이용하여 수정한 예제이다. Cart 클래스의 변수 ($item, $item_num) 와 함수(Cart(), output())에 $num 변수가 추가하여 add_Cart 에 포함된 add_num($num) 함수는 기본클래스의 과일 박스 수(20)에 $num(5)를 가산하는 함수이며, 클래스 sub_Cart에 포함된 sub_num($num) 함수는 기본클래스의 과일 박스 수(20) 에 $num(5)를 감산하는 함수이다. 여기서 주의할 점은 클래스 이름 Cart와 함수이름 Cart()가 동일해야 상속이 가능하다.

 

<?php

class Cart{

 

var $item   //변수(속성) 선언

var $item_num

 

   function Cart($art_name =“사과”, $art_num =“20”){//Cart 생성자 정의

      $this->item =$art_name;

     $this->item_num=$art_num;

  }

 

   function output(){

    echo “$this->item : $this->item_num 박스 <br>”

  }

 

}

 

  $info_cart =new Cart();

echo  “info_cart => “ $info_cart-> output();

 

class add_Cart extends Cart{

   function add_num($num){

   $this->item_num=$this->item_num+$num;

   }

}

 

   $info_add_Cart =new add_Cart();

   $info_add_Cart->add_num(5);

   echo “add_Cart =>” $info_add_Cart->output();

 

class sub_Cart extends Cart{

    function sub_num($num){

    $this->item_num =$this->item_num-$num;

   }

}

 

 

$sub_cart =new sub_Cart;

$sub_cart->sub_num(5);

echo “sub_cart ==>” $sub_cart->output();

 

 

?>

 

 

->출력

info_cart => 사과 : 20 박스
add_Cart =>사과 : 25 박스
sub_cart ==>사과 : 15 박스

 

다음은 Cart 에 이름을 붙이는 named_Cart를 사용하여 카트의 주인을 설정하고 주인이 Cart를 찾아볼 수 있게 만들어 보자. 또한 기존의 일반 카트(normal cart) 에 있던 함수도 사용할 수 있다.

 

<?php

 

class Cart {

   var $item                                      // 변수(속성) 선언

   var $item_num

   function Cart($art_name=“과일”, $art_num=“20”) {   // Cart 생성자 정의

   $this->item = $art_name;

   $this->item_num = $art_num;

  }

   function output () {                              // 출력 기능 메소드

    echo “$this->item : $this->item_num 박스 <br>”

    }

}

 

class name_Cart  extends Cart {

     var $owner

 

    function set_owner($name){

    $this->owner=$name;

   }

}

 

$name_cart=new name_Cart();

$name_cart->set_owner(“홍길동”);

echo “name_cart==>카트 주인 이름 :”

echo “$name_cart->owner<br>”

 

?>

->출력

name_cart==>카트 주인 이름 :홍길동

 

클래스 내부에 있는 함수에서 $this 라는 변수는 자기 자신 object를 의미한다. $this->something 의 형태로 현재 object의 변수나 함수를 사용하여야 한다. 파생된 (drived)클래스의 경우, 이 클래스의 생성자가 호출될 때 부모 클래스이ㅡ 생성자는 자동으로 호출되지 않는다.

 

<?php

 

$add_cart =new add_Cart;   //$add_cart 객체 생성

$add_cart->add_num(5);// 20 + 5

echo “add_cart==>”

$add_cart->output();

 

$default_Cart =new add_Cart;  //$default_cart 객체 생성

$default_Cart->add_num(30);  // 20 + 30

echo “default_cart ==>”

$default_Cart->output();

 

?>

 

예제 “inheritance.php” 에 위에서 설명한 내용들을 추가하여 Cart에 이름을 붙여 주인이 확인하기 쉽게 해주고, 파생클래스 add_Cart를 다시 재사용하는 $default_Cart 객체를 생성하여 과일 20박스에 다시 30박스를 추가하는 “cart.php”를 작성해 보자.

 

<?php

class Cart {

var $item                                      // 변수(속성) 선언

var $item_num

  function Cart($art_name=“과일”, $art_num=“20”) {   // Cart 생성자 정의

     $this->item = $art_name;

      $this->item_num = $art_num;

  } 

   function output () {                              // 출력 기능 메소드

   echo “$this->item : $this->item_num 박스 <br>”   

  }

}

 

 

class  name_Cart extends Cart {   // Cart  클래스를 상속 받은 name_cart 클래스

    var $owner

    function set_owner($name) {    

    $this->owner = $name;

    }

}

 

 

class  add_Cart extends Cart {    // Cart  클래스를 상속 받은 add_cart 클래스

    function add_num($num) {    

       $this->item_num = $this->item_num + $num;

    }

}

 

 

 $info_cart = new Cart;             // $info_cart 객체 생성

 $info_cart->Cart();                 // 생성자로 객체 초기화

echo “info_cart ==> “      $info_cart-> output();

 

 $name_cart = new name_Cart;       // $name_cart 객체 생성

 $name_cart->set_owner(“홍길동”);    // 이름 객체 초기화

echo “name_cart ==> 카트 주인 이름 : “  echo “$name_cart->owner <br>”

 

 $add_cart = new add_Cart;          // $add_cart 객체 생성

 $add_cart->add_num(5);             // 20 + 5

echo “add_cart ==> “     $add_cart->output();

 

 $default_Cart = new add_Cart;       // $default_cart 객체 생성

 $default_Cart->add_num(30);         // 20 + 30

echo “default_cart ==> “ $default_Cart->output();

 

 

 

$default_Cart->add_num(100);

$default_Cart->output();

 

?>

 

 

->출력

info_cart ==> 과일 : 20 박스
name_cart ==> 카트 주인 이름 : 홍길동
add_cart ==> 과일 : 25 박스
default_cart ==> 과일 : 50 박스

과일 : 150 박스

 

8.4 기 정의된 클래스 사용하기

 

지금까지는 직접 클래스를 만들어 객체를 사용하여 보았지만, 다른 방법으로 이미 정의되어 있는 기존 클래스를 사용하는 방법을 알아보겠다.

 

예제 “cart.php”를 다음과 같이 수정하여 기 정의된 클래스를  “cart.inc”로 만들어 보자.

“cart.inc”

<?php

class Cart {

    var $item                        // 변수(속성) 선언

    var $item_num

    function Cart($art_name=“과일”, $art_num=“20”) {   // Cart 생성자 정의

        $this->item = $art_name;

        $this->item_num = $art_num;

    }

    function output () {               // 출력 기능 메소드

        echo “$this->item : $this->item_num 박스 <br>”   

    }

 }

 

 

class  name_Cart extends Cart {      // Cart  클래스를 상속 받은   name_cart 클래스

    var $owner

    function set_owner($name) {    

        $this->owner = $name;

    }

 }

 

 

class  add_Cart extends Cart {       // Cart  클래스를 상속 받은 add_cart 클래스

    function add_num($num) {    

       $this->item_num = $this->item_num + $num;

    }

 }

 

 

class  sub_Cart extends Cart {       // Cart  클래스를 상속 받은 sub_cart 클래스

    function sub_num($num) {    

       $this->item_num = $this->item_num – $num;

    }

 }

?>

 

          

 

위에서 기본 클래스는 Cart, 파생 클래스는 name_Cart, add_Cart, sub_Cart로 선언하였다.

클래스의 실행 메소드 정의를 “include_cart.php”로 다음과 같이 만들어 보자. 이미 정의된 클래스(cart.inc)를 참조하기 위하여 include 나  require문을 사용해서 해당 클래스가 정의된 파일을 삽입한다. 한 가지 다른 점은 require문을 쓰면 조건문을 쓰더라도 해당 파일을 삽입하므로 파일을 선택적으로 삽입할 수 없고, 선택적으로 파일을 삽입하려면 include문을 사용한다.

 

다음 예제 $info_cart 인스턴스는 Cart 클래스에 정의한 Cart(“과일”, “20”) 함수값을 출력하고, $name_cart 인스턴스는 파생클래스인 name_Cart(“홍길동”) 값을 출력하고, $add_cart인스턴스는 파생클래스인 add_Cart(5)를 수행하여 과일 20박스에 5박스를 가산한 25박스를 출력하고, $sub_cart 인스턴스는 파생클래스인 sub_Cart(5)를 수행하여 과일 20박스에 5박스를 감산한 15박스를 출력하고, $default_cart 인스턴스는 파생클래스인 add_Cart의 메소드를 상속받기 때문에 과일 20박스에 30박스를 가산한 50박스를 출력하고, $my_cart 인스턴스는 기본클래스인 Cart(“포도”, “60”)를 수행하여 포도 60박스를 출력한다.

 

 

<?php

     include(“cart.inc”);

?>

<html><head><title> 기  정의된 클래스 사용 </title></head><body>

 

<?php

 

$info_cart=new Cart;

echo “info_cart ==>” $info_cart->output();

 

$name_cart =new name_Cart;

echo “name_cart ==>”  $name_cart->set_owner(“홍길동”);

 

$add_cart = new add_Cart;

$add_cart->add_num(5);

echo “add_cart==>” $add_cart->output();

 

 

$sub_cart=new sub_Cart;

$sub_cart->sub_num(5);

echo “sub_cart ==>” $sub_cart->output();

 

$default_Cart =new add_Cart;

$default_Cart->add_num(30);

echo “default_cart ==>” $default_Cart->output();

 

$my_Cart =new Cart;

$my_Cart->Cart(“포도”, “60”);

echo “my_cart ==>” $my_Cart->output();

 

?>

 

 

</body></html>

 

 

->출력

info_cart ==>과일 : 20 박스
name_cart ==>카트 주인 이름 : 홍길동
add_cart==>과일 : 25 박스
sub_cart ==>과일 : 15 박스
default_cart ==>과일 : 50 박스
my_cart ==>포도 : 60 박스

 

다음은 HTML문서에서 카트의 주인 이름($name) 과 과일의 종류($item), 가감할 박스이 숫자($item_num)를 입력 받아 기 정의된 클래스를 “cart.inc”를 이용하여 출력하는 예제를 만들어 보자.

 

다음과 같이 cart.html을 만들어 보자.

<html><head>                        

<title>  기 정의된 클래스(cart.inc) 사용  </title>

</head>

<form action=“name_cart.php”>

주인이름 :<input type=“text” name=“name”><br><br>

과일 종류 :<input type=“text” name=“item”><br><br>

가감할 박스 종류 :<input type=“text” name=“item_num” size=“15” maxlength=“3” ><br><br>

<input type=“submit” value=“입력값 전송”/>

</form>

</body></html>

->출력

주인이름 :

과일 종류 :

가감할 박스 종류 :

 

 

name_cart.php

<?php

     include(“cart.inc”);

?>

<?php

isset($_GET[“name”]) ? $name =$_GET[“name”] : null

isset($_GET[“item_num”]) ? $item_num =$_GET[“item_num”] : null

isset($_GET[“item”]) ? $item =$_GET[“item”] : null

 

    $info_cart = new Cart;             // $info_cart 객체 생성

    $info_cart->Cart();                 // 생성자로 객체 초기화

    echo “기존에 갖고있는 과일(info_cart) ==> “  $info_cart-> output();

 

    $name_cart = new name_Cart;     // $name_cart 객체 생성

    $name_cart->set_owner($name);    // 이름 객체 초기화

    echo “카트 주인 이름(name_cart) ==> “  echo “$name_cart->owner <br>”

 

    $add_cart = new add_Cart;        // $add_cart 객체 생성

    $add_cart->add_num($item_num);   // 20 + $item_num

    echo “가산된 전체 박스(add_cart) ==> “  $add_cart->output();

 

    $sub_cart = new sub_Cart;         // $sub_cart 객체 생성

    $sub_cart->sub_num($item_num);    // 20 – $item_num

    echo “감산된 전체 박스(sub_cart) ==> “     $sub_cart->output();

 

    $my_Cart = new Cart;              // $my_cart 객체 생성

    $my_Cart->Cart($item, $item_num);  //  과일의 종류와 박스 수 객체 초기화

    echo “새로 구입한 과일과 박스 수(my_cart) ==> “  $my_Cart-> output();

?>

->출력

기존에 갖고있는 과일(info_cart) ==> 과일 : 20 박스
카트 주인 이름 : 홍길동
카트 주인 이름(name_cart) ==> 홍길동
가산된 전체 박스(add_cart) ==> 과일 : 28 박스
감산된 전체 박스(sub_cart) ==> 과일 : 12 박스
새로 구입한 과일과 박스 수(my_cart) ==> 바나나 : 8 박스

 

about author

PHRASE

Level 60  머나먼나라

인간의 의지에 저항할 수 있는 것은 없다. -디즈레일리

댓글 ( 4)

댓글 남기기

작성