고급 PHP 프로그래밍 – 객체 지향 PHP – 1 – 상속과 다형성

고급 PHP 프로그래밍 - 객체 지향 PHP - 1 - 상속과 다형성
고급 PHP 프로그래밍 – 객체 지향 PHP – 1 – 상속과 다형성

고급 PHP 프로그래밍 – 객체 지향 PHP – 상속과 다형성

안녕하세요~ 😊
이번 시간에는 객체 지향 프로그래밍(OOP)의 핵심 개념 중에서도 가장 강력하고 매력적인 기능인
**상속(inheritance)**과 **다형성(polymorphism)**에 대해 배워볼 거예요!

이 개념을 이해하면 코드가 훨씬 더 재사용성 높고, 구조화된 형태로 발전하게 돼요.
비유를 통해 쉽게 이해하고, 예제로 바로바로 실습해보는 방식으로 설명드릴게요!


상속이란?

상속이란, 기존 클래스의 속성과 기능을 그대로 물려받아 새로운 클래스를 만드는 기능이에요.
마치 부모님의 성격이나 특성을 자식이 물려받는 것처럼, 클래스도 부모의 기능을 상속받을 수 있어요!


✅ 기본 문법

class 부모클래스 {
    // 공통 기능
}

class 자식클래스 extends 부모클래스 {
    // 부모 기능 + 새로운 기능
}

✅ 예제: 사람 → 직원

class Person {
    public $name;

    public function sayHello() {
        echo "안녕하세요, 저는 {$this->name}입니다.<br>";
    }
}

class Employee extends Person {
    public $department;

    public function work() {
        echo "{$this->name}님은 {$this->department} 부서에서 일하고 있어요.<br>";
    }
}

$e = new Employee();
$e->name = "홍길동";
$e->department = "개발";
$e->sayHello();  // 부모 클래스 메서드 호출
$e->work();      // 자식 클래스 메서드 호출

상속을 통해 기존 기능은 그대로 유지하면서, 새로운 기능을 추가할 수 있어요!


오버라이딩(Overriding)

자식 클래스에서 부모 메서드 이름을 동일하게 선언하면,
부모의 메서드를 **덮어쓰기(재정의)**하게 됩니다.

class Animal {
    public function sound() {
        echo "동물이 소리를 냅니다.<br>";
    }
}

class Dog extends Animal {
    public function sound() {
        echo "멍멍!<br>";
    }
}

$d = new Dog();
$d->sound(); // 멍멍!

같은 이름이지만, 자식 클래스에 맞는 방식으로 동작하게 바꿔줄 수 있어요!


다형성이란?

**다형성(Polymorphism)**이란 같은 이름의 메서드라도,
상속 구조에서 객체마다 다르게 동작할 수 있는 성질이에요.

쉽게 말해, **”같은 말인데 누가 말하느냐에 따라 다르게 들리는 것”**이에요 😊


✅ 예제: 동물 소리 다르게 구현하기

class Animal {
    public function makeSound() {
        echo "동물 소리<br>";
    }
}

class Dog extends Animal {
    public function makeSound() {
        echo "멍멍<br>";
    }
}

class Cat extends Animal {
    public function makeSound() {
        echo "야옹<br>";
    }
}

function playSound(Animal $animal) {
    $animal->makeSound();
}

playSound(new Dog()); // 멍멍
playSound(new Cat()); // 야옹

makeSound()라는 같은 메서드 이름이지만,
객체의 실제 타입에 따라 다르게 동작하죠!


추상 클래스와 다형성

더 발전된 형태로 추상 클래스를 이용하면 다형성을 더욱 명확하게 구현할 수 있어요.

✅ 추상 클래스 예제

abstract class Shape {
    abstract public function getArea();
}

class Circle extends Shape {
    public $radius;

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

    public function getArea() {
        return pi() * pow($this->radius, 2);
    }
}

class Rectangle extends Shape {
    public $width;
    public $height;

    public function __construct($w, $h) {
        $this->width = $w;
        $this->height = $h;
    }

    public function getArea() {
        return $this->width * $this->height;
    }
}

$shapes = [new Circle(3), new Rectangle(4, 5)];

foreach ($shapes as $shape) {
    echo "넓이: " . $shape->getArea() . "<br>";
}

다양한 도형 클래스가 각자 다른 방식으로 넓이를 구하지만,
같은 인터페이스(getArea)를 사용하니 다형성의 진수를 느낄 수 있어요!


왜 상속과 다형성이 중요할까요?

기능 장점
상속 코드 재사용, 유지보수 용이
오버라이딩 상황에 맞는 기능 재정의 가능
다형성 인터페이스 통일, 유연한 코드 작성 가능

실무에서는 상속 + 다형성으로 코드 구조를 모듈화, 캡슐화, 확장성 있게 구성할 수 있어요!


주의사항 및 체크리스트

항목 설명
extends 상속할 때 사용하는 키워드
부모 메서드 오버라이딩 같은 이름으로 자식 클래스에서 재정의 가능
parent:: 부모 메서드를 명시적으로 호출할 때
다형성 활용 타입 힌트와 인터페이스/추상클래스 함께 사용
오버라이딩 시 주의 시그니처(인자 수)는 동일해야 함

마무리하며 😊

상속과 다형성은 객체지향 프로그래밍의 핵심이에요!
이 개념을 제대로 익히면, 복잡한 프로젝트도 구조적으로 쪼개서 효율적으로 개발할 수 있어요.

  • 상속은 재사용과 확장을,
  • 다형성은 유연함과 일관성을 만들어 줍니다.

다음 시간에는 **접근 제어자(public, private, protected)**와 함께
추상 클래스와 인터페이스의 차이점도 함께 알아볼게요!

오늘도 실력이 쑥쑥 자라는 하루! 여러분 최고예요 💪💻🐶🐱📐

답글 남기기