코딩 스쿨 PHP

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

PHP Inheritance

PHP 상속(Inheritance): 클래스 간의 코드 재사용


  • *상속(Inheritance)**은 **객체 지향 프로그래밍(OOP)**의 중요한 개념 중 하나로, 한 클래스가 다른 클래스의 속성과 메서드를 물려받는 기능을 말합니다. 상속을 통해 코드의 재사용성을 높일 수 있으며, **부모 클래스(Parent Class)**의 기능을 **자식 클래스(Child Class)**가 상속받아 확장하거나 변경할 수 있습니다.

이 가이드에서는 PHP 상속의 개념, 기본 사용법, 메서드 오버라이딩, parent 키워드상속의 실제 예제를 다룹니다.


1. 상속의 기본 개념

상속은 부모 클래스가 가진 속성과 메서드를 자식 클래스가 그대로 물려받아 사용할 수 있는 기능입니다. 상속을 통해 중복 코드를 줄이고, 유지보수가 더 쉬워집니다.

1.1 상속의 기본 구조

  • 부모 클래스(Parent Class): 상속을 제공하는 클래스.
  • 자식 클래스(Child Class): 부모 클래스로부터 상속받아 속성과 메서드를 사용할 수 있는 클래스.
<?php
// 부모 클래스
class Animal {
    public $name;

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

    public function speak() {
        return "$this->name makes a sound.";
    }
}

// 자식 클래스
class Dog extends Animal {
    public function speak() {
        return "$this->name barks.";
    }
}

// 객체 생성
$dog = new Dog("Rex");
echo $dog->speak();  // 결과: Rex barks.
?>

설명:

  • Dog 클래스Animal 클래스를 상속받아 name 속성speak() 메서드를 사용할 수 있습니다.
  • 자식 클래스에서 speak() 메서드를 **재정의(오버라이딩)**하여 부모 클래스의 기본 동작을 변경할 수 있습니다.

2. 상속 사용법

PHP에서 상속은 extends 키워드를 사용하여 정의합니다. 자식 클래스는 부모 클래스의 모든 **공개(public)**와 보호된(protected) 속성 및 메서드를 상속받을 수 있습니다.

2.1 상속의 기본 예제

<?php
// 부모 클래스
class Person {
    public $name;
    public $age;

    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }

    public function greet() {
        return "Hi, I'm $this->name and I'm $this->age years old.";
    }
}

// 자식 클래스
class Employee extends Person {
    public $position;

    public function __construct($name, $age, $position) {
        parent::__construct($name, $age);  // 부모 클래스 생성자 호출
        $this->position = $position;
    }

    public function introduce() {
        return $this->greet() . " I work as a $this->position.";
    }
}

$employee = new Employee("John", 30, "Developer");
echo $employee->introduce();  // 결과: Hi, I'm John and I'm 30 years old. I work as a Developer.
?>

설명:

  • Employee 클래스는 Person 클래스를 상속받아 name, age, greet() 메서드를 사용할 수 있습니다.
  • *parent::__construct()*를 사용해 부모 클래스의 생성자를 호출하여, 부모 클래스에서 정의한 속성도 초기화할 수 있습니다.

3. 메서드 오버라이딩(Method Overriding)

상속받은 자식 클래스에서 부모 클래스의 메서드를 **재정의(Overriding)**할 수 있습니다. 오버라이딩은 자식 클래스가 부모 클래스의 메서드와 동일한 이름매개변수로 새롭게 정의하는 것을 말합니다.

3.1 메서드 오버라이딩 예제

<?php
class Animal {
    public $name;

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

    public function speak() {
        return "$this->name makes a sound.";
    }
}

class Cat extends Animal {
    // 부모 클래스의 speak 메서드 오버라이딩
    public function speak() {
        return "$this->name meows.";
    }
}

$cat = new Cat("Kitty");
echo $cat->speak();  // 결과: Kitty meows.
?>

설명:

  • Cat 클래스는 Animal 클래스의 speak() 메서드를 재정의하여 고양이의 소리를 나타냅니다.
  • 자식 클래스에서 부모 클래스의 메서드를 새롭게 정의하는 방식으로 원하는 동작을 구현할 수 있습니다.

4. parent 키워드

parent 키워드는 자식 클래스에서 부모 클래스의 속성이나 메서드에 접근할 때 사용됩니다. 특히 부모 클래스의 생성자나 메서드를 호출할 때 사용합니다.

4.1 부모 생성자 호출

<?php
class Vehicle {
    public $brand;

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

class Car extends Vehicle {
    public $model;

    // 자식 클래스의 생성자에서 부모 생성자를 호출
    public function __construct($brand, $model) {
        parent::__construct($brand);  // 부모 클래스의 생성자 호출
        $this->model = $model;
    }

    public function display() {
        return "This car is a $this->brand $this->model.";
    }
}

$myCar = new Car("Toyota", "Corolla");
echo $myCar->display();  // 결과: This car is a Toyota Corolla.
?>

설명:

  • *parent::__construct()*는 부모 클래스의 생성자를 호출하여, 부모 클래스에서 정의된 속성(brand)을 초기화합니다.
  • 자식 클래스에서 부모 클래스의 생성자뿐만 아니라 다른 메서드도 호출할 수 있습니다.

4.2 부모 메서드 호출

<?php
class Animal {
    public function makeSound() {
        return "Some generic animal sound";
    }
}

class Dog extends Animal {
    // 부모 클래스 메서드를 호출한 후 확장
    public function makeSound() {
        return parent::makeSound() . " and a bark";
    }
}

$dog = new Dog();
echo $dog->makeSound();  // 결과: Some generic animal sound and a bark
?>

설명:

  • *parent::makeSound()*는 부모 클래스의 makeSound() 메서드를 호출하고, 그 결과에 추가적인 내용을 붙여 반환합니다.
  • 이처럼 부모 클래스의 동작을 유지하면서 확장할 수 있습니다.

5. 다중 상속(Multiple Inheritance)은 지원되지 않음

PHP는 **다중 상속(Multiple Inheritance)**을 지원하지 않습니다. 즉, 하나의 자식 클래스는 단 하나의 부모 클래스만 상속받을 수 있습니다. 다중 상속을 지원하기 위한 대안으로 **트레이트(Trait)**가 사용됩니다.


6. 실용 예제: 상속을 통한 사용자 관리 시스템 구현

<?php
// 부모 클래스: User
class User {
    public $username;
    public $email;

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

    public function getUserInfo() {
        return "Username: $this->username, Email: $this->email";
    }
}

// 자식 클래스: Admin
class Admin extends User {
    public $role;

    public function __construct($username, $email, $role) {
        parent::__construct($username, $email);  // 부모 클래스 생성자 호출
        $this->role = $role;
    }

    public function getAdminInfo() {
        return $this->getUserInfo() . ", Role: $this->role";
    }
}

// 객체 생성
$admin = new Admin("john_doe", "john@example.com", "Administrator");
echo $admin->getAdminInfo();  // 결과: Username: john_doe, Email: john@example.com, Role: Administrator
?>

설명:

  • User 클래스는 사용자 정보를 저장하며, Admin 클래스는 User 클래스를 상속받아 **관리자 역할(role)**을 추가합니다.
  • 상속을 통해 사용자 관리 시스템에서 일반 사용자와 관리자의 공통된 속성(username, email)을 재사용할 수 있습니다.

7. 상속을 사용할 때 주의사항

  • 단일 상속: PHP는 다중 상속을 지원하지 않으므로, 하나의 자식 클래스는 단 하나의 부모 클래스만 상속받을 수 있습니다.
  • 과도한 상속: 상속은 매우 강력한 기능이지만

, 너무 깊은 상속 구조는 코드를 복잡하게 만들 수 있습니다. 상속은 적절하게 사용해야 유지보수가 용이합니다.

  • 캡슐화 유지: 상속받은 클래스에서 private 멤버는 접근할 수 없으므로, 상속을 통해 접근해야 할 멤버는 protected로 선언하는 것이 좋습니다.

요약

PHP의 **상속(Inheritance)**은 객체 지향 프로그래밍에서 코드 재사용확장성을 가능하게 하는 중요한 개념입니다. 부모 클래스의 속성과 메서드를 자식 클래스가 상속받아 사용할 수 있으며, 자식 클래스에서 부모 클래스의 메서드를 **오버라이딩(재정의)**할 수도 있습니다. 또한, parent 키워드를 사용해 부모 클래스의 생성자나 메서드에 접근할 수 있습니다. 상속을 통해 중복 코드를 줄이고, 프로그램의 구조를 더 체계적으로 만들 수 있습니다.


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