IMCAT.DEV
로그인 가입
PHP 중급 객체지향

PHP 상속과 다형성

PHP 상속과 다형성 — 중급

상속과 다형성

1. 도입 (왜 배워야 하는가)

상속과 다형성은 객체 지향 프로그래밍(OOP)의 핵심 개념으로, 소프트웨어 개발에서 코드의 재사용성과 유지 관리성을 높이는 데 매우 중요한 역할을 합니다. 이 두 개념을 이해하지 못하면 중복 코드가 발생하고, 변경 사항을 반영하는 데 어려움을 겪게 됩니다. 예를 들어, 클래스가 서로 연관된 경우 모든 클래스에 동일한 기능을 추가하거나 수정해야 할 때, 상속을 활용하면 부모 클래스에서 한 번만 수정하면 됩니다. 따라서 코드의 일관성을 유지하고, 오류를 줄일 수 있습니다.

2. 핵심 개념 설명

상속

상속은 한 클래스가 다른 클래스의 속성과 메소드를 물려받는 기능입니다. 부모 클래스는 일반적인 속성과 메소드를 정의하고, 자식 클래스는 이를 확장하여 더 구체적인 기능을 추가합니다. 이 과정은 마치 부모가 자식에게 유전자를 물려주는 것과 비슷합니다.

다형성

다형성은 동일한 메소드 이름이 다양한 클래스에서 다른 기능을 수행할 수 있도록 하는 개념입니다. 이는 마치 '운전'이라는 행동이 차, 오토바이, 자전거에서 각기 다르게 나타날 수 있는 것과 같습니다.

용어설명
부모 클래스다른 클래스에 속성과 메소드를 물려주는 클래스
자식 클래스부모 클래스를 상속받아 기능을 확장하는 클래스
오버라이딩부모 클래스의 메소드를 자식 클래스에서 재정의하는 것

3. 기본 코드 예제

아래는 상속과 다형성을 보여주는 간단한 코드 예제입니다.

class Animal {
    public function speak() {
        return "소리를 내다";
    }
}

class Dog extends Animal {
    public function speak() {
        return "멍멍!";
    }
}

class Cat extends Animal {
    public function speak() {
        return "야옹!";
    }
}

$dog = new Dog();
$cat = new Cat();

echo $dog->speak(); // 멍멍!
echo $cat->speak(); // 야옹!

실행 결과:

멍멍!
야옹!

코드 한 줄씩 동작 설명:

  1. Animal 클래스를 정의합니다. 이 클래스는 기본 메소드 speak()를 포함합니다.
  2. Dog 클래스는 Animal 클래스를 상속받습니다. speak() 메소드를 오버라이딩하여 개의 소리를 반환합니다.
  3. Cat 클래스는 Animal 클래스를 상속받습니다. speak() 메소드를 오버라이딩하여 고양이의 소리를 반환합니다.
  4. Dog와 Cat 클래스의 인스턴스를 생성합니다.
  5. 각 인스턴스의 speak() 메소드를 호출하여 개와 고양이의 소리를 출력합니다.
  6. 4. 실전 활용 예제

    쇼핑몰에서 장바구니를 구현할 때

    class CartItem {
        protected $name;
        protected $price;
    
        public function __construct($name, $price) {
            $this->name = $name;
            $this->price = $price;
        }
    
        public function getPrice() {
            return $this->price;
        }
    }
    
    class DiscountedItem extends CartItem {
        private $discount;
    
        public function __construct($name, $price, $discount) {
            parent::__construct($name, $price);
            $this->discount = $discount;
        }
    
        public function getPrice() {
            return $this->price - $this->discount;
        }
    }
    
    $item1 = new CartItem("일반 상품", 10000);
    $item2 = new DiscountedItem("할인 상품", 10000, 2000);
    
    echo $item1->getPrice(); // 10000
    echo $item2->getPrice(); // 8000

    자동차 관리 시스템

    class Vehicle {
        public function start() {
            return "차량이 시작되었습니다.";
        }
    }
    
    class Car extends Vehicle {
        public function start() {
            return "자동차가 시작되었습니다.";
        }
    }
    
    class Bike extends Vehicle {
        public function start() {
            return "자전거가 시작되었습니다.";
        }
    }
    
    $car = new Car();
    $bike = new Bike();
    
    echo $car->start(); // 자동차가 시작되었습니다.
    echo $bike->start(); // 자전거가 시작되었습니다.

    5. 흔한 실수와 주의사항

    실수 1: 메소드 오버라이딩 시 부모 메소드를 호출하지 않음

    class ParentClass {
        public function show() {
            echo "부모 클래스 메소드\n";
        }
    }
    
    class ChildClass extends ParentClass {
        public function show() {
            // 부모 메소드 호출을 잊음
            echo "자식 클래스 메소드\n";
        }
    }
    
    $child = new ChildClass();
    $child->show(); // 자식 클래스 메소드

    해결: 부모 메소드를 호출하여 기능을 확장합니다.

    실수 2: 잘못된 상속 관계 설정

    class Animal {}
    class Dog extends Cat {} // Cat 클래스를 상속해야 함

    해결: 올바른 상속 관계를 설정합니다.

    6. 정리

    • 상속은 코드 재사용성을 높이고, 다형성은 동일한 메소드 이름으로 다양한 기능을 구현할 수 있게 합니다.
    • 부모 클래스와 자식 클래스의 관계를 이해하는 것이 중요합니다.
    • 오버라이딩 시 부모 메소드를 잊지 말고 호출하도록 합니다.
    • 다음에 학습하면 좋은 주제: 인터페이스와 추상 클래스, 디자인 패턴.