추상 클래스
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 91개 중 25번째.
추상 클래스는 직접 인스턴스화할 수 없는 클래스입니다. 이는 다른 클래스의 청사진 역할을 하며, 자식 클래스가 반드시 구현해야 하는 메서드를 정의합니다. abstract 키워드를 사용하여 추상 클래스를 생성합니다.
<?php
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}
$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();
출력:
15Shape 클래스는 구현을 제공하지 않고 추상 메서드 calculateArea()를 선언합니다. Shape를 확장하는 모든 클래스는 이 메서드를 구현해야 합니다. 추상 클래스는 자식 클래스가 직접 상속받는 getColor()와 같은 일반 메서드도 포함할 수 있다는 점에 유의하세요.
추상 메서드는 자식 클래스가 무엇을 해야 하는지 정의하지만, 어떻게 해야 하는지는 정의하지 않습니다. 이는 모든 도형이 calculateArea() 메서드를 갖도록 보장하면서, 각 도형이 자신의 넓이를 다르게 계산할 수 있도록 합니다.
핵심 포인트: 추상 클래스는 상속의 구조와 강제된 요구 사항을 결합합니다. 관련된 클래스들 간에 코드를 공유하면서 각 자식 클래스가 특정 메서드를 반드시 구현하도록 보장하고 싶을 때 사용하세요.
챌린지
쉬움추상 클래스가 계약을 강제하면서도 서로 다른 미디어 유형이 각자의 재생 동작을 구현할 수 있도록 하는 미디어 플레이어 시스템을 구축해 보겠습니다.
코드는 다음 세 개의 파일로 구성됩니다:
Media.php— 모든 미디어 유형의 청사진 역할을 하는 추상 클래스Media를 정의합니다. 이 클래스는 보호된(protected)$title속성과 제목을 받아 설정하는 생성자를 가져야 합니다. 자식 클래스가 반드시 구현해야 하는play()라는 추상 메서드를 포함하세요. 또한 제목을 반환하는 일반 메서드getTitle()을 추가하세요. 이 구체적인 메서드는 모든 자식 클래스에 상속됩니다.Song.php—Media를 상속받는Song클래스를 정의합니다. 파일 상단에 Media 파일을 포함(include)하세요. 이 클래스는$artist속성을 추가합니다. 생성자는 제목과 아티스트를 인자로 받아야 하며, 제목은parent::__construct()를 사용하여 설정하고 아티스트는 직접 설정하세요."Playing song: [title] by [artist]"를 반환하도록 필수 메서드인play()를 구현하세요.Podcast.php—Media를 상속받는Podcast클래스를 정의합니다. 파일 상단에 Media 파일을 포함하세요. 이 클래스는$episode속성(정수)을 추가합니다. 생성자는 제목과 에피소드 번호를 인자로 받아야 하며, 제목은parent::__construct()를 사용하여 설정하고 에피소드는 직접 설정하세요."Playing podcast: [title] - Episode [episode]"를 반환하도록 필수 메서드인play()를 구현하세요.
main.php에서 Song과 Podcast 파일을 모두 포함하세요. 노래 제목, 아티스트 이름, 팟캐스트 제목, 에피소드 번호(정수로 변환할 문자열)의 네 가지 입력을 받게 됩니다. 이 값들로 Song과 Podcast 객체를 생성하세요. 먼저 노래의 play()를 호출한 결과를 출력하고, 그다음 팟캐스트의 결과를 각각 별도의 줄에 출력하세요.
이 챌린지는 추상 클래스가 어떻게 계약을 정의하는지 보여줍니다. 모든 미디어 유형은 반드시 play() 메서드를 가져야 하지만, 각 유형은 이를 다르게 구현합니다. 추상 클래스 Media는 직접 인스턴스화할 수 없으며, 자식 클래스에 구조와 공유 기능을 제공하기 위해서만 존재합니다.
치트 시트
추상 클래스는 직접 인스턴스화할 수 없는 클래스입니다. 이는 다른 클래스를 위한 청사진 역할을 하며, 자식 클래스가 반드시 구현해야 하는 메서드를 정의합니다. 추상 클래스를 만들려면 abstract 키워드를 사용하세요.
abstract class Shape {
protected $color;
public function __construct($color) {
$this->color = $color;
}
abstract public function calculateArea();
public function getColor() {
return $this->color;
}
}자식 클래스는 모든 추상 메서드를 구현해야 합니다:
class Rectangle extends Shape {
private $width;
private $height;
public function __construct($color, $width, $height) {
parent::__construct($color);
$this->width = $width;
$this->height = $height;
}
public function calculateArea() {
return $this->width * $this->height;
}
}주요 특징:
- 추상 클래스는 직접 인스턴스화할 수 없습니다
- 추상 메서드는 추상 클래스 내에 구현부가 없습니다
- 자식 클래스는 모든 추상 메서드를 구현해야 합니다
- 추상 클래스는 추상 메서드와 일반 메서드를 모두 포함할 수 있습니다
- 추상 클래스의 일반 메서드는 자식 클래스에 상속됩니다
직접 해보기
<?php
require_once 'Song.php';
require_once 'Podcast.php';
// 입력 읽기
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));
// TODO: songTitle과 artistName을 사용하여 Song 객체 생성
// TODO: podcastTitle과 episodeNumber를 사용하여 Podcast 객체 생성
// TODO: song 객체의 play() 호출 결과 출력
// TODO: podcast 객체의 play() 호출 결과 출력
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8매직 메서드
매직 메서드 소개__toString 및 __debugInfo__get, __set, __isset, __unset__call 및 __callStatic__clone 및 객체 복제__serialize 및 __unserialize요약 - 커스텀 컬렉션