[PHP] 클래스(class) 사용하기

2022. 9. 29. 00:02Program/PHP

102_PHP class 사용하기

[요약]

  • 복잡한 시스템을 구현할 때 사용하면 편리한 class 사용방법에 대해 알아보자

대규모 시스템을 개발하는 것은 많은 변수와 함수를 사용함을 의미한다.

이러한 환경에서 기능을 변경하는 것은 해당 기능의 코드를 찾는 것 만으로도 어려운 일이 되기도 한다.

이를 방지하기 위해 클래스를 사용하여 시스템을 개발하게 된다.

클래스는 어떠한 특정 기능에 관계가 있는 변수와 함수를 모아놓은 것을 의미한다.

특정한 기능이라면 다음과 같은 예를 들 수 있다.

 

데이터베이스를 예로 들어보자.

a.php 페이지에 데이터베이스의 데이터를 불러오는 프로그래밍 코드가 있고, b.php 페이지에는 데이터베이스의 데이터를 입력하는 코드가 있으며, c.php 페이지에는 데이터베이스의 데이터를 수정하는 코드가 있다고 가정하자.

데이터베이스에 대해 입력 기능, 출력 기능, 수정 기능이 3개의 페이지에서 독립적으로 구동된다는 것을 알 수 있다.

이렇게 어느 하나의 대상에 대한 기능을 하나로 합칠 때 생성한 class로 대상의 데이터를 불러오는 기능, 데이터를 입력하는 기능, 데이터를 수정하는 기능 등을 모아놓을 수 있다.

 

이렇게 class를 하나의 객체(사물, 물건 등을 뜻함)로 의미하여 이를 객체지향 프로그래밍이라고 부른다.


[class 사용 방법]

class 클래스명 {
  기능 구현
}

PHP에서 class를 선언할 때 주의할 점은 같은 이름의 class를 2개 이상 만들 수 없다는 것이다.a라는 class가 2개 이상 선언되면 오류가 발생한다.

 

글을 쓸 때 사용하는 pen을 프로그래밍으로 객체화한다면 다음과 같이 표현할 수 있다.

class pen {
}

여러 종류의 펜이 있고 색, 두께, 가격도 각각 다를 것이다.이러한 데이터를  대입하기 위한 변수를 class 내에 선언할 수 있다.변수는 class 내에서 프로퍼티(property)라고 부른다.

 

펜의 색을 의미하는 프로퍼티 color, 두께를 의미하는 프로퍼티 bold, 가격을 의미하는 프로퍼티 price를 선언하면 다음과 같다.

class pen {
  public $color;
  public $bold;
  public $price;
}

프로퍼티 앞에 public이 있다.이것은 접근 제한자 라고 부른다.접근 제한자의 종류와 기능은 다음과 같다.

 

[접근 제한자]

종류 의미
public 클래스 안에서든 밖에서든 접근 가능, 상속 가능
protected 클래스 내부에서만 접근 가능, 상속 가능
private 클래스 내부에서만 접근 가능, 상속 불가

기능을 적용하기 위해 클래스에 함수를 만든다.함수는 class 내에서 메소드(method)라고 부른다.메소드를 선언하는 방법은 함수를 선언하는 방법과 크게 다르지 않다.


[클래스에 메소드 만들기]

class 클래스명 {
  프로퍼티
  
  function 메소드명() {
  
  }
}

메소드를 선언할 때 function의 앞에 접근 제한자를 사용한다.메소드 생성시 접근 제한자를 사용하지 않을때 public이 기본적으로 설정된다.클래스 pen에 기능을 적용해보자.pen의 본래 목적은 글을 쓰거나 그림을 그리는 것으로 write() 함수와 draw() 함수를 pen 클래스에 만든다.write() 메소드와 draw() 메소드를 만들면 다음과 같다.

class pen {
  public $color;
  public $bold;
  public $price;
  
  function write($contents) {
    echo "{$contents}을 쓰다.";
  }
  
  function draw($contents) {
    echo "{$contents}을 그리다.";
  }
}

 

다음은 class를 사용하는 방법에 대해 알아보자.생성한 class를 사용하려면 class의 객체를 생성해야 한다.이것을 인스턴스 생성이라고 부른다.


다음은 pen 클래스의 인스턴스를 생성하는 방법이다.

[클래스의 인스턴스 생성하기]

new 클래스명();

사용할 때만다 매번 생성할 수 없으므로 이것을 변수에 대입하여 사용한다.

변수명 = new 클래스명();

 

아래는 pen 클래스의 인스턴스를 생성하는 방법이다.

$pen = new pen();

클래스의 메소드를 호출하는 방법에 대해 알아보자.

[클래스에 있는 메소드를 호출하는 방법]

클래스 객체 변수 -> 호출할 메소드명();

클래스 pen에 있는 메소드 write()를 호출하면 다음과 같다.write() 메소드에는 파라미터가 있으므로 아규먼트를 사용한다.(아규먼트를 입력하지 않으면 오류가 발생한다.)

$pen->write('책');

 

다음은 pen 클래스의 write() 메소드를 호출하는 예제이다.

[예제: 105-1_method.php ]

<?php
    class pen {
      public $color;
      public $bold;
      public $price;

      public function write($contents) {
        echo "{$contents}을(를) 쓰다.";
      }

      public function draw($contents) {
        echo "{$contents}을(를) 그리다.";
      }
    }

    $pen = new pen();
    $pen->write('책');
?>

실행결과

 

인스턴스를 생성할 때 클래스명 뒤에 '()'를 사용한 것을 확인할 수 있다.

'()'의 용도에 대해 알아보자.

클래스의 인스턴스를 생성할 때 자동적으로 실행되는 메소드가 있다.

생성자는 인스턴스를 생성하면 자동적으로 호출된다.


[생성자 사용 방법]

class 클래스명() {
  function __construct() {
  }
}

construct() 앞에 위치한 _(하이픈)은 2회 사용한다.

인스턴스를 생성할 때 '()'안에 아규먼트를 입력하면 이 값은 클래스의 생성자에 전달된다.

 

다음은 클래스에 생성자를 사용한 예제이다.

[예제: 105-2_construct.php ]

<?php
    class pen {
      public $color;
      public $bold;
      public $price;

      function __construct($color, $bold, $price) {
        echo "사용중인 펜";
        echo "<br>";
        echo "색 : {$color}";
        echo "<br>";
        echo "두께 : {$bold}";
        echo "<br>";
        echo "가격 : {$price}원";
      }
    }

    $pen = new pen('핑크', '두꺼운', '1000');
?>

실행결과

 

생성자와 반대의 개념으로 소멸자가 있다.

소멸자는 인스턴스의 사용이 끝날 때 작동한다.

생성자와 마찬가지로 _(하이븐)을 2회 적고 destruct를 적는다.


[소멸자 사용 방법]

class 클래스명() {
  function __destruct() {
  }
}

 

다음은 소멸자를 활용한 예제이다.

[예제: 105-3_destruct.php ]

<?php
    class pen
    {
      public $color;
      public $bold;
      public $price;

      function __construct($color, $bold, $price)
      {
        echo "사용중인 펜";
        echo "<br>";
        echo "색 : {$color}";
        echo "<br>";
        echo "두께 : {$bold}";
        echo "<br>";
        echo "가격 : {$price}원";
      }

      public function write($contents)
      {
        echo "{$contents}을(를) 쓰다. ";
      }

      function __destruct()
      {
        echo "pen 객체 사용이 끝났습니다.";
      }
    }

    $pen = new pen('핑크', '두꺼운', '1000');
    echo 'Hello World ';
    $pen->write('글');
?>

실행결과


이번에는 프로퍼티에 값을 대입하는 방법에 대해 알아보자.

처음에 값을 대입할 때는 변수에 값을 대입하는 방법과 같다.

$color = 'blue';

이후에 인스턴스를 생성할 때나 메소드를 호출하여 프로퍼티에 새로운 값을 대입하기 위해서는 $this를 사용한다.

$this->프로퍼티명 = 값;

생성자 안에서 프로퍼티 cplor에 새로운 값을 대입하려면 다음과 같이 사용한다.

$this->color = 'red';

 

다음은 인스턴스 생성시에 생성자에 아규먼트를 사용하고 프로퍼티의 값을 변경하는 예제이다.

[예제: 105-4_this.php ]

<?php
    class pen {
      public $color = '파란';

      function __construct($color) {
        echo "파라미터 color의 값 : {$color}";
        echo "<br>";
        echo "프로퍼티 color의 값 : {$this->color}";
        echo "<br>";
        $this->color = $color;
      }

      public function write($contents) {
        echo "{$this->color}색 펜을 사용하여 ";
        echo "{$contents}을(를) 쓰다. ";
      }
    }

    $pen = new pen('핑크');
    $pen->write('글');
?>

실행결과

결과의 두 번째 줄을 보면 프로퍼티 color의 값은 '파란'이지만 세 번째 줄에서 '핑크'로 바뀐 것을 알 수 있다.


앞에서 알아본 접근 제한자를 보면 상속이라는 내용이 있다.

public과 protected는 상속이 가능하며, private는 상속이 불가능하다.

상속은 이미 선언된 클래스의 내용을 다른 클래스에서 사용할 수 있는 기능이다.

즉 상속을 하면 클래스와 클래스 간에 부모 자식 관계가 형성된다.

상속을 사용하려면 extends라는 명령문을 사용한다.

 

[extends 사용 방법]

class 클래스명 extends 상속받을 클래스명

 

다음은 클래스 a 를 생성하고 클래스 a에 메소드 hello를 생성한 후 클래스 a를 상속받는 클래스 b를 생상하고 클래스 b의 인스턴스를 생성하여 메소드 hello를 호출하는 예제이다.

[예제: 105-5_extends.php ]

<?php
    class a {
      function hello()
      {
        echo "hello world";
      }
    }

    class b extends a {
    }

    $b = new b;
    $b->hello();
?>

실행결과

 

접근 제한자 중 private를 사용하면 상속받아도 사용할 수 없다.

다음은 이를 확인하는 예제이다.

[코드 105-5]와 동일하며 메소드 hello를 선언할 때 private 접근 제한자를 사용한 부분만 다르다.

[예제: 105-6_private.php ]

<?php
    class a {
      private function hello()
      {
        echo "hello world";
      }
    }

    class b extends a {
    }

    $b = new b;
    $b->hello();
?>

실행결과

상속받을 수 없는 메소드를 상속받은 클래스에서 호출했으므로 오류가 발생한다.


클래스는 1개의 클래스로부터 상속받을 수 있지만, 2개 이상의 클래스는 상속받을 수 없다.

그러므로 1개 이상의 자식 클래스는 있을 수 있지만 2개 이상의 부모 클래스는 있을 수 없다.

 

다음은 1개의 부모 클래스와 2개의 자식 클래스를 생성한 예제이다.

[예제: 105-7_extends.php ]

<?php
    class operation {
      function plus($num1, $num2) {
        $result = $num1 + $num2;
        return "{$num1} + {$num2} = " . $result;
      }
    }

    class load extends operation{}
    class load2 extends operation{}

    $load2 = new load2;
    echo $load2->plus(1, 2);
?>

실행결과

오류 없이 결과가 나타난다.


[코드 105-6]에서 접근 제한자의 상속 가능, 불가능에 대해 알아보았다.

이번에는 접근 제한자의 public의 의미인 클래스 밖에서도 안에서도 접근 가능의 의미와 protected, private의 클래스 내부에서만 접근 가능의 의미에 대해 알아보자.

 

클래스 밖의 의미는 클래스를 생성할 때 사용한 {}괄호의 밖을 의미한다.

반대로 클래스 안의 의미는 클래스를 생성할 때 사용한 {}괄호의 안을 의미한다.

지금까지 여러 예제를 통해 클래스 밖에서 메소드를 호출했다.

이것은 public으로 메소드를 선언했기 때문이다.

만약 protected 또는 private로 메소드를 생성했다면 오류가 발생하게 된다.

 

다음은 protected로 메소드를 선언한 예제이다.

[예제: 105-8_protected.php ]

<?php
    class a{
      protected function hello() {
        echo "hello world";
      }
    }

    $a = new a;
    $a->hello();
?>

실행결과

protected로 선언된 메소드를 클래스 밖에서 호출하여 에러가 발생했다.


다음은 protected로 선언하여 같은 클래스 내에서 호출하는 함수이다.

같은 클래스에서 프로퍼티를 사용할 때 $this를 사용했듯이 같은 클래스에서 메소드를 사용하려면 $this를 사용한다.

 

[예제: 105-9_protected.php ]

<?php
    class a{
      protected function hello() {
        echo "hello world";
      }

      public function print() {
        $this->hello();
      }
    }

    $a = new a;
    $a->print();
?>

실행결과

print() 메소드는 접근 제한자가 public이므로 클래스 밖에서 호출이 가능하며, print() 메소드는 클래스 안에서 메소드 hello()를 호출하므로 오류가 발생하지 않는다.


지금까지는 클래스의 인스턴스를 생성하여 객체에서 메소드를 호출할 수 있었다.

이번에는 인스턴스 생성 없이 메소드를 호출하는 방법에 대해 알아보자.

메소드를 선언할 때 function 앞에 static을 붙여주면 해당 메소드는 클래스 외부에서 인스턴스를 생성하지 않고도 호출 할 수 있는 메소드가 된다.

 

[static 사용 방법]

static function 메소드명(){}

접근 제한자를 사용하여 메소드를 생성할 경우에는 접근 제한자 다음에 static을 기입한다.

접근제한자 static function 메소드명(){}

인스턴스를 생성하지 않고 클래스를 사용하려면 클래스명 뒤에 (::)를 사용한 후 메소드명을 입력한다.

 

[인스턴스를 생성하지 않고 메소드(static 사용)를 호출하는 방법]

클래스명::메소드명();

 

다음은 static을 사용하여 메소드를 생성한 후 인스턴스를 생성하지 않고 메소드를 호출하는 예제이다.

[예제: 105-10_static.php ]

<?php
    class hello{

      public static function output($word){
        echo $word;
      }
    }

    hello::output("hello world");
?>

실행결과

 

 


 

 

 

초보자를 위한 PHP 200제
김태영 지음 | 정보문화사