코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

PHP Abstract Classes

PHP 추상 클래스(Abstract Classes): 공통 기능의 틀을 제공


  • *PHP 추상 클래스(Abstract Class)**는 **객체 지향 프로그래밍(OOP)**에서 공통 기능의 기본 틀을 제공하는 클래스로, 하위 클래스에서 반드시 구현해야 하는 메서드를 정의할 수 있습니다. 추상 클래스는 구체적인 인스턴스를 만들 수 없으며, 자식 클래스에서만 상속받아 사용할 수 있습니다. 이를 통해 일관된 인터페이스기본 동작을 자식 클래스에 제공할 수 있습니다.

이 가이드에서는 PHP 추상 클래스의 개념, 추상 클래스 정의 방법, 추상 메서드와 일반 메서드의 차이점, 인터페이스와의 차이점실용적인 예제를 다룹니다.


1. PHP 추상 클래스의 개념

  • *추상 클래스(Abstract Class)**는 직접 인스턴스화할 수 없고, 반드시 다른 클래스에서 상속을 받아 구현해야 하는 클래스를 의미합니다. 추상 클래스는 일부 구현된 메서드구현되지 않은 추상 메서드를 포함할 수 있으며, 자식 클래스는 추상 메서드를 반드시 재정의(구현)해야 합니다.

2. 추상 클래스 정의

PHP에서 추상 클래스는 abstract 키워드를 사용하여 정의됩니다. 추상 클래스는 일부만 구현된 클래스로, 객체를 생성할 수 없고 상속받는 자식 클래스가 이를 완성해야 합니다.

2.1 추상 클래스의 기본 구조

<?php
// 추상 클래스 정의
abstract class Animal {
    // 추상 메서드 (구현 없음)
    abstract public function makeSound();

    // 일반 메서드 (구현 있음)
    public function sleep() {
        return "The animal is sleeping.";
    }
}

// 자식 클래스가 추상 메서드를 반드시 구현해야 함
class Dog extends Animal {
    public function makeSound() {
        return "The dog barks.";
    }
}

// 객체 생성
$dog = new Dog();
echo $dog->makeSound();  // 결과: The dog barks.
echo $dog->sleep();  // 결과: The animal is sleeping.
?>

설명:

  • 추상 클래스abstract 키워드를 사용하여 정의되며, 객체를 직접 생성할 수 없습니다.
  • 추상 메서드는 자식 클래스에서 반드시 **구현(재정의)**해야 하며, 메서드 본문 없이 선언만 합니다.
  • 일반 메서드는 추상 클래스에서 구현된 상태로, 자식 클래스가 그대로 사용할 수 있습니다.

3. 추상 메서드

  • *추상 메서드(Abstract Method)**는 구현되지 않은 메서드로, 자식 클래스에서 반드시 구현해야 합니다. 추상 클래스는 공통 인터페이스를 정의하면서도, 구체적인 구현은 자식 클래스가 결정하도록 합니다.

3.1 추상 메서드 예제

<?php
abstract class Shape {
    // 추상 메서드: 자식 클래스에서 반드시 구현해야 함
    abstract public function area();
}

// 자식 클래스에서 추상 메서드 구현
class Circle extends Shape {
    private $radius;

    public function __construct($radius) {
        $this->radius = $radius;
    }

    public function area() {
        return pi() * $this->radius * $this->radius;
    }
}

$circle = new Circle(5);
echo "Circle Area: " . $circle->area();  // 결과: Circle Area: 78.539816339745
?>

설명:

  • Shape 클래스는 추상 클래스이며, area() 메서드를 추상 메서드로 정의했습니다.
  • Circle 클래스는 반지름을 가지고 있으며, Shape에서 상속받은 area() 메서드를 구현하여 원의 면적을 계산합니다.

4. 추상 클래스와 일반 클래스의 차이점

4.1 추상 클래스와 일반 클래스 비교

  • 추상 클래스:
    • *인스턴스화(객체 생성)**할 수 없습니다.
    • 추상 메서드를 포함할 수 있으며, 자식 클래스에서 반드시 구현해야 합니다.
    • 일반 메서드추상 메서드를 모두 포함할 수 있습니다.
  • 일반 클래스:
    • 직접 인스턴스화할 수 있습니다.
    • 모든 메서드는 구현되어 있어야 합니다.

5. 추상 클래스와 인터페이스의 차이점

인터페이스추상 클래스는 모두 공통 인터페이스를 정의하는 데 사용되지만, 둘 사이에는 중요한 차이점이 있습니다.

5.1 추상 클래스와 인터페이스 비교

항목 추상 클래스 인터페이스
인스턴스화 가능 여부 인스턴스화 불가능 인스턴스화 불가능
메서드 구현 여부 일부 메서드 구현 가능 모든 메서드는 구현 불가 (선언만 가능)
다중 상속 지원 여부 다중 상속 불가 다중 구현 가능 (한 클래스에서 여러 인터페이스를 구현할 수 있음)
속성 지원 여부 속성(변수) 포함 가능 속성 포함 불가
키워드 abstract 키워드 사용 interface 키워드 사용

5.2 추상 클래스와 인터페이스 사용 예

<?php
// 인터페이스 정의
interface Drawable {
    public function draw();
}

// 추상 클래스 정의
abstract class Shape {
    abstract public function area();
}

// 자식 클래스에서 추상 클래스와 인터페이스 둘 다 구현
class Circle extends Shape implements Drawable {
    private $radius;

    public function __construct($radius) {
        $this->radius = $radius;
    }

    public function area() {
        return pi() * $this->radius * $this->radius;
    }

    public function draw() {
        return "Drawing a circle.";
    }
}

$circle = new Circle(5);
echo $circle->area();  // 결과: 78.539816339745
echo $circle->draw();  // 결과: Drawing a circle.
?>

설명:

  • 인터페이스다중 구현이 가능하며, 클래스는 여러 인터페이스를 구현할 수 있습니다.
  • 추상 클래스는 공통된 기능의 기본 구조를 제공하면서, 추가적인 구현을 자식 클래스에 맡깁니다.

6. 추상 클래스 실용 예제

6.1 사용자 인증 시스템 예제

<?php
abstract class User {
    protected $username;
    protected $password;

    public function __construct($username, $password) {
        $this->username = $username;
        $this->password = $password;
    }

    // 추상 메서드: 자식 클래스에서 구현해야 함
    abstract public function authenticate();
}

class Admin extends User {
    public function authenticate() {
        // 관리자 인증 로직
        return "Admin $this->username authenticated.";
    }
}

class Guest extends User {
    public function authenticate() {
        // 게스트 인증 로직
        return "Guest $this->username authenticated.";
    }
}

// 객체 생성 및 인증
$admin = new Admin("adminUser", "adminPass");
echo $admin->authenticate();  // 결과: Admin adminUser authenticated.

$guest = new Guest("guestUser", "guestPass");
echo $guest->authenticate();  // 결과: Guest guestUser authenticated.
?>

설명:

  • User추상 클래스로, authenticate()라는 추상 메서드를 정의했습니다.
  • AdminGuest 클래스는 각각 상속받아 사용자 유형별 인증 로직을 구현합니다.
  • 추상 클래스를 사용하여 사용자 인증이라는 공통된 기능을 제공하고, 구체적인 인증 방식은 각 자식 클래스에서 결정합니다.

7. PHP에서 추상 클래스를 사용하는 이유

  • 코드 재사용성: 공통된 기능이나 속성을 부모 클래스에서 정의하고, 이를 상속받아 자식 클래스에서 재사용할 수 있습니다.
  • 일관된 인터페이스 제공: 추상 메서드를 통해 자식 클래스가 반드시 구현해야 할 메서드를 강제할 수 있습니다. 이를 통해 일관된 구조를 유지할 수 있습니다.
  • 추상화 수준 제공: 구체적인 구현을 자식 클래스에 맡기고, 부모 클래스에서는 공통된 구조만 정의하여 높은 수준의 추상화를 제공합니다.

요약

PHP 추상 클래스는 자식 클래스가 상속받아 **필수적으로 구현해야 하는 메서드(추상 메서드)**를 포함하는 클래스입니다. 추상 클래스는 공통된 인터페이스를 제공하면서

도, 구체적인 구현은 자식 클래스에서 이루어지도록 강제합니다. 이를 통해 코드 재사용성을 높이고 일관된 구조를 유지할 수 있습니다. 추상 메서드일반 메서드를 모두 포함할 수 있으며, 추상 클래스는 직접 인스턴스화할 수 없습니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com