R's Hacking Daily Log

php 객체 지향 프로그램 (4) 본문

PHP

php 객체 지향 프로그램 (4)

hanhxx 2023. 7. 16. 17:43

Step 1 :: interface

만약 꼭 필요한 함수가 있지만 실행 내용이 모두 다르다면 어떻게 해야 할까?

부모 클래스로부터 상속받아 자식 클래스마다 알맞게 오버라이딩한다?

 

부모 클래스로부터 파생되는 모든 자식 클래스의 함수 내용이 다르다면 굳이 상속받을 필요 없이

클래스마다 달리 정의해 버리면 될 것이다.

 

이럴 상황에서 활용할 수 있는 게 인터페이스이다.

인터페이스는 미리 필요한 멤버 변수나 메서드를 정의, 선언만 해둘 뿐 그 내용을 기술하지 않는다. 

 

즉 인터페이스는 큰 틀만 만들어놓고 세부적인 내용은 인터페이스를 가져다 쓰는 클래스에서 작성하면 된다.

상속에서는 extends keyword를 사용했다면 인터페이스는 implements keyword를 사용한다. 

 

<?php
interface Animal {
    public function animal_type();
}

class Cat implements Animal {
    public function animal_type() {
        echo "냐옹냐옹";
    }
}
class Dog implements Animal {
    public function animal_type() {
        echo "월월";
    }
}

코드를 보면 animal_type 함수를 가지는 인터페이스가 하나 만들어져 있다.

 

상속과 달리 인터페이스는 클래스의 상속 구조와 상관없이 인터페이스에 정의된 함수나 변수를 사용할 수 있어야 한다. 

따라서 인터페이스 내에 정의되는 변수 & 함수는 public 접근 제어자로 정의된다. 

 

interface를 가져다 Cat & Dog class는 각각 다른 울음소리를 출력하는 함수 내용을 작성했다.

 

이처럼 클래스 내부에서 구체적인 내용을 작성하여 사용하면 되기 때문에 

인터페이스는 꼭 필요한 메서드의 규격을 정리하여 가지고 있는 용도라고 할 수 있다.

 

 

클래스로 객체를 하나씩 만들어주고 animal_type 함수를 호출하면 

동일한 인터페이스를 이용해 함수를 작성했지만 클래스마다 다른 내용이 실행되는 걸 볼 수 있다.

 

이처럼 하나 이상의 클래스가 동일한 인터페이스를 사용하는 경우를 "다형성"이라 정의한다. 

 

 


Step 2 :: 추상 클래스 & 추상 메서드 

만약 클래스처럼 미리 정의해 둔 내용과 인터페이스처럼 서로 달리 정의해야 하는 내용이 공존한다면

어떻게 해야할까? 

 

아쉽게도 클래스와 인터페이스는 혼합해서 사용할 수 없다. 

이런 상황에서 등장하는 개념이 바로 추상 클래스이다.

 

"추상"이라는 의미는 아직 구현이 덜 되었거나 미완성 상태를 의미한다.

따라서 (1) 추상 클래스는 객체를 생성할 수 없으며

(2) 추상 클래스를 상속 받은 하위 클래스 또한 추상 클래스가 된다. 

 

(3) 추상 클래스는 반드시 하나 이상의 추상 메서드를 포함해야하며 

(4) 추상 메서드는 자식 클래스에서 반드시 선언되어야 한다. 

 

추상 클래스라고 해서 반드시 추상 메서드만을 가지는 것은 아니다.

추상 메서드와 비추상 메서드를 포함하는 클래스로 추상 메서드에 대한 내용만 자식 클래스에서 작성해 주면 된다. 

<?php
abstract class Animal {
    public string $type;
    public string $name;
    public int $age;

    public function describe() {
        echo "{$this->type}의 이름은 {$this->name}, {$this->age}살 입니다.<br/>";
    }
    abstract public function greet();
}

 

추상 클래스 OR 추상 메서드를 정의하기 위해서는 abstract keyword를 사용한다. 

abstract keyword로 추상 클래스인 Animal class를 생성했다.

 

Animal class는 멤버 변수 type, name, age와 메서드 describe, greet를 포함하고 있다.

이때 greet 함수는 abstract keyword를 사용한 추상 메서드로 선언된 걸 볼 수 있다. 

 

추상 메서드이기 때문에 함수 내용은 작성되지 않고 인터페이스처럼 선언만 된 상태인 것!!

 

 

class Dog extends Animal {
    public function greet() {
        echo "월월";
    }
}

추상 클래스 Animal을 상속 받은 자식 클래스 Dog는 추상 클래스를 상속받았기 때문에

greet 함수를 구현해야한다. 

 

greet 함수를 구현함으로써 Dog 클래스는 객체를 구현할 수 있게 된다. 

 

 

$animal = new Dog();
$animal->type = "dog";
$animal->name = "dily";
$animal->age = 9;

$animal->describe();
$animal->greet();

Dog 클래스로 객체를 생성해서 멤버 변수 값을 할당해 주고 describe & greet 함수를 호출한다.

 

describe 함수는 추상 클래스에 선언된 비추상 메서드 describe를 상속받았기 때문에 Dog 클래스에서 

구현하지 않고도 호출이 가능하고 

 

greet 함수는 추상 메서드이기 때문에 Dog 클래스 내부에서 구현해 호출한 것이다. 

 

 

코드의 마지막 두 줄에서 함수를 호출하게 되면 결과는 오른쪽과 같이 출력되는 걸 볼 수 있을 것이다. 

'PHP' 카테고리의 다른 글

php 객체 지향 프로그램 (6)  (0) 2023.07.18
php 객체 지향 프로그램 (5)  (0) 2023.07.18
php 객체 지향 프로그램 (3)  (0) 2023.07.13
php 객체 지향 프로그램 (2)  (0) 2023.07.12
php 객체 지향 프로그램 (1)  (0) 2023.07.10
Comments