15.4 추상화

클래스의 상속과 오버라이딩, 인터페이스를 세 가지의 클래스 확장 기능을 배웠습니다. 하지만 이중 상속과 인터페이스 두 개는 함께 사용할 수 없습니다. 즉, 상속과 인터페이스 규약을 혼합하여 사용할 수 없습니다.

이 두 개를 서로 같이 사용할 수 없는 이유는 상속과 인터페이스는 문법이 서로 매우 비슷합니다. 클래스명과 키워드 그리고 상속, 인터페이스명입니다.

class 클래스명 extends 상속 클래스
{
}

class 클래스명 implements 인터페이스
{
}

두 개의 기능을 콤마(,)등을 이용하여 구분하거나 연장해서 사용할 수 없다는 것입니다.

추상화는 이러한 문법적 유사점과 두 가지 기능을 유지하면서 두 개의 기능을 같이 사용하기 위한 것이 방법입니다. 즉, 추상화 = 상속 + 인터페이스 기능을 동시에 하고 싶을 때 사용되는 OOP 개념입니다.



15.4.1 추상화 문법

클래스에 추상화 사용법 또한 매우 간단합니다. 추상화 설정은 클래스명 또는 메서드 앞에 새로운 추상화 키워드 abstract를 같이 선언만 해주면 됩니다.

|문법|

abstract class 추상화 클래스
{
    // 추상화: 인터페이스
    abstract public function 메서드();

    // 공통 메서드
    public function copyright() {
        echo "copyright all Right JinyPHP";
    }
}

class 클래스명 extends 추상화 클래스
{
    public function 메서드() {
        return "abstract Method";
    }
}

클래스를 정의할 때 abstract 키워드를 이용하여 추상화 클래스와 메서드 등을 생성합니다. 추상화로 선언한 메서드들은 인터페이스와 같이 자식 클래스에서 반드시 선언해야 합니다.

추상화 클래스를 적용하는 방법은 상속과 같이 extends 키워드로 사용합니다.



15.4.2 추상화 예제

예제 파일 abstract-01.php

<?php

    // 추상화 클래스를 선언합니다.
    abstract class a
    {
        // 확장 시 구현부가 필요한 메서드 정의
        abstract public function isAdult($age);
        
        public function copyright ()
        {
            // 본 메서드 함수는 대체되지 않습니다.
            echo "copyright all Right JinyPHP";
        }
    }

    // 추상화 적용
    class b extends a
    {
        // 추상화 인터페이스를 구현
        public function isAdult($age)
        {
            if ($age>=18) return true; else return false;
        }
    }

    $obj = new b();

    // 추상화에 선언된 일반 메서드를 상속, 호출 가능합니다.
    $obj->copyright();

    if ($obj->isAdult(18)){
        echo "성인입니다.";
    } else {
        echo "미성년입니다.";
    }

?>

결과

copyright all Right JinyPHP 성인입니다.

위의 예제를 보면 추상화 클래스는 일반 클래스처럼 프로퍼티와 메서드 등을 구현할 수 있습니다. 또한 자식 클래스에서 다시 구현 처리해야 하는 인터페이스는 abstract 키워드를 추가하여 함께 선언합니다.

추상화 클래스를 상속받은 자식 클래스는 부모의 메서드 기능도 같이 상속받아 호출 사용 가능합니다. 또한 abstract로 선언한 인터페이스 메서드를 같이 구현해야 합니다.

추상화에서 선언된 인터페이스를 구현하지 않은 경우 PHP는 에러를 출력하고 PHP 코드를 더 이상 실행하지 않습니다. 이것은 인터페이스 규약을 따르지 않는 동작과 유사합니다.