PHP - 상속: 초보자 가이드

안녕하세요, 미래의 PHP 마법사 여러분! 오늘 우리는 PHP 상속의 세계로 흥미로운 여정을 떠납니다. 프로그래밍에 처음이라면 걱정 마세요 - 저는 친절한 안내자로서 단계별로 설명해 드릴게요. 그럼 커피 한 잔 (또는 당신이 좋아하는 차)을 손에 쥐고, 함께 뛰어들어 보겠습니다!

PHP - Inheritance

상속이란 무엇인가요?

상속은 PHP에서 클래스의 가족 트리와 같은 개념입니다. 당신이 할머니의 눈을 물려받거나 아버지의 유머 감각을 물려받는 것처럼, 프로그래밍에서는 하나의 클래스가 다른 클래스로부터 속성과 메서드를 상속할 수 있습니다. 이 개념은 더욱 조직적이고 재사용 가능한 코드를 작성하는 데 도움이 됩니다.

이렇게 생각해 보세요: 가상의 비디오 게임을 만들고 있다고 가정해 봅시다. 모든 캐릭터는 일부 기본적인 특성(이름이나 체력 포인트 등)을 공유할 수 있지만, 각 캐릭터 타입(전사나 마법사 등)은 고유한 능력을 가질 수 있습니다. 상속은 이러한 공통된 특성을 기본 클래스에서 정의하고, 그 특성을 상속받아 고유한 기능을 추가하는 특정 캐릭터 클래스를 만들 수 있게 해줍니다.

기본 상속 예제

PHP에서 상속이 어떻게 작동하는지 간단한 예제를 통해 살펴보겠습니다.

class Animal {
public $name;

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

public function speak() {
echo "The animal makes a sound.";
}
}

class Dog extends Animal {
public function speak() {
echo $this->name . " barks: Woof woof!";
}
}

$myDog = new Dog("Buddy");
$myDog->speak(); // 출력: Buddy barks: Woof woof!

이 예제에서 우리는 두 개의 클래스 AnimalDog을 가지고 있습니다. Dog 클래스는 Animal 클래스를 상속받고 있습니다. 즉, Dog 클래스는 Animal 클래스의 모든 속성과 메서드를 상속받습니다.

다음과 같이 설명해 보겠습니다:

  1. 우리는 기본 Animal 클래스를 정의하고, $name 속성과 speak() 메서드를 가집니다.
  2. Dog 클래스는 Animal 클래스를 extends 키워드를 사용하여 상속받습니다.
  3. Dog 클래스는 speak() 메서드를 자신만의 구현으로 오버라이드합니다.
  4. 우리는 새로운 Dog 객체 "Buddy"를 생성하고 그의 speak() 메서드를 호출합니다.

Dog 클래스는 Animal 클래스로부터 $name 속성을 상속하지만, speak() 메서드는 자신만의 버전으로 제공합니다. 이를 메서드 오버라이딩이라고 하며, 상속의 강력한 기능 중 하나입니다.

상속과 접근 제한자

이제 상속이 다양한 접근 제한자(공개, 보호, 사생)와 어떻게 작동하는지 대해 이야기해 보겠습니다.

class Vehicle {
public $brand;
protected $model;
private $serialNumber;

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

public function getInfo() {
return "Brand: " . $this->brand . ", Model: " . $this->model;
}

protected function getSerialNumber() {
return $this->serialNumber;
}
}

class Car extends Vehicle {
public $doors;

public function __construct($brand, $model, $serialNumber, $doors) {
parent::__construct($brand, $model, $serialNumber);
$this->doors = $doors;
}

public function getFullInfo() {
return $this->getInfo() . ", Doors: " . $this->doors . ", SN: " . $this->getSerialNumber();
}
}

$myCar = new Car("Toyota", "Corolla", "ABC123", 4);
echo $myCar->getFullInfo();
// 출력: Brand: Toyota, Model: Corolla, Doors: 4, SN: ABC123

이 예제에서:

  1. Vehicle 클래스는 다양한 접근 제한자를 가진 속성을 가집니다.
  2. Car 클래스는 Vehicle을 상속받고 자신만의 속성($doors)을 추가합니다.
  3. Car 클래스는 공개와 보호된 멤버에 접근할 수 있지만, 사생 멤버에 접근할 수 없습니다.
  4. 우리는 parent::__construct()를 사용하여 부모 클래스의 생성자를 호출합니다.

기억해 두세요:

  • 공개 멤버는 어디서나 접근할 수 있습니다.
  • 보호 멤버는 클래스와 그 서브 클래스 내에서 접근할 수 있습니다.
  • 사생 멤버는 정의된 클래스 내에서만 접근할 수 있습니다.

생성자와 상속

생성자가 상속에서 어떻게 작동하는지 더 깊이 탐구해 보겠습니다:

class Shape {
protected $color;

public function __construct($color) {
$this->color = $color;
echo "Shape constructor called.<br>";
}
}

class Circle extends Shape {
private $radius;

public function __construct($color, $radius) {
parent::__construct($color);
$this->radius = $radius;
echo "Circle constructor called.<br>";
}

public function getInfo() {
return "A {$this->color} circle with radius {$this->radius}";
}
}

$myCircle = new Circle("red", 5);
echo $myCircle->getInfo();

출력:

Shape constructor called.
Circle constructor called.
A red circle with radius 5

이 처리 과정은 다음과 같습니다:

  1. Circle 객체를 생성할 때, PHP는 먼저 Shape 생성자를 호출합니다.
  2. 그런 다음 Circle 생성자를 호출합니다.
  3. 우리는 parent::__construct($color)를 사용하여 Shape 생성자를 호출하고 $color 속성을 설정합니다.
  4. 마지막으로, 우리는 Circle 클래스에 고유한 $radius 속성을 설정합니다.

이렇게 하면 부모와 자식 클래스가 모두 올바르게 초기화됩니다.

메서드 참조 표

우리 예제에서 사용한 메서드에 대한 간단한 표를 제공해 드리겠습니다:

메서드 설명
__construct() 생성자 메서드, 객체가 생성될 때 호출됩니다
speak() 동물이 소리를 내는 메서드
getInfo() 차량에 대한 기본 정보를 가져오는 메서드
getSerialNumber() 차량의 시리얼 번호를 가져오는 보호 메서드
getFullInfo() 차량에 대한 완전한 정보를 가져오는 메서드

결론

상속은 PHP에서 강력한 도구로, 클래스의 계층 구조를 만들고 코드 재사용과 조직화를 촉진합니다. 기억하시오, LEGO 블록으로 만드는 것처럼 - 기본 블록을 시작으로 고유한 블록을 쌓아 올립니다.

PHP 여정을 계속하면서 상속을 더 많이 사용하는 흥미로운 방법을 발견할 것입니다. 열심히 연습하면 곧 복잡하고 효율적인 객체 지향 프로그램을 손쉽게 만들 수 있을 것입니다!

미래의 PHP 마스터 여러분, 즐겁게 코딩하세요! ??‍??‍?

Credits: Image by storyset