학습
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(); // 야옹!
실행 결과:
멍멍!
야옹!
코드 한 줄씩 동작 설명:
Animal클래스를 정의합니다. 이 클래스는 기본 메소드speak()를 포함합니다.Dog클래스는Animal클래스를 상속받습니다.speak()메소드를 오버라이딩하여 개의 소리를 반환합니다.Cat클래스는Animal클래스를 상속받습니다.speak()메소드를 오버라이딩하여 고양이의 소리를 반환합니다.Dog와Cat클래스의 인스턴스를 생성합니다.- 각 인스턴스의
speak()메소드를 호출하여 개와 고양이의 소리를 출력합니다. - 상속은 코드 재사용성을 높이고, 다형성은 동일한 메소드 이름으로 다양한 기능을 구현할 수 있게 합니다.
- 부모 클래스와 자식 클래스의 관계를 이해하는 것이 중요합니다.
- 오버라이딩 시 부모 메소드를 잊지 말고 호출하도록 합니다.
- 다음에 학습하면 좋은 주제: 인터페이스와 추상 클래스, 디자인 패턴.
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 클래스를 상속해야 함
해결: 올바른 상속 관계를 설정합니다.