추상 클래스
Coddy PHP 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 91개 중 25번째.
abstract class는 직접 인스턴스화할 수 없는 class입니다. 다른 class의 청사진 역할을 하며, 자식 class가 Implement해야 하는 method를 Define합니다. abstract 키워드를 사용하여 abstract class를 Create합니다.
<?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()와 같은 일반 메서드도 포함될 수 있다는 점에 유의하세요.
추상 method는 자식 class가 무엇을 해야 하는지는 정의하지만, 방법은 정의하지 않습니다. 이를 통해 모든 도형이 calculateArea() method를 갖도록 하면서 각 도형이 서로 다른 방식으로 넓이를 계산할 수 있습니다.
핵심 사항: abstract class는 상속의 구조와 강제되는 요구 사항을 결합합니다. 관련된 class 간에 코드를 공유하면서 각 자식 class가 특정 method를 Implement하도록 보장하고 싶을 때 사용하세요.
챌린지
쉬움abstract class가 contract를 적용하면서도 서로 다른 media type이 각자의 재생 동작을 Implement할 수 있도록 하는 media player system을 만들어 보겠습니다.
코드를 세 개의 파일로 구성합니다.
Media.php: 모든 media type의 청사진 역할을 하는 abstractMediaclass를 Define합니다. protected$titleproperty와 title을 accepts하고 sets하는 constructor가 있어야 합니다. 자식 class가 Implement해야 하는play()라는 abstract method를 포함합니다. 또한 title을 returns하는 일반 methodgetTitle()도 Add합니다. 이 concrete method는 모든 자식 class에 상속됩니다.Song.php:Media를 extends하는Songclass를 Define합니다. 상단에 Media 파일을 Include합니다. 이 class는$artistproperty를 추가합니다. constructor는 title과 artist를 accepts해야 합니다. title에는parent::__construct()를 사용한 다음 artist를 직접 sets합니다. 필요한play()method를 Implement하여"Playing song: [title] by [artist]"를 return하도록 합니다.Podcast.php:Media를 extends하는Podcastclass를 Define합니다. 상단에 Media 파일을 Include합니다. 이 class는$episodeproperty( integer)를 추가합니다. constructor는 title과 episode number를 accepts해야 합니다. title에는parent::__construct()를 사용한 다음 episode를 sets합니다. 필요한play()method를 Implement하여"Playing podcast: [title] - Episode [episode]"를 return하도록 합니다.
main.php에서는 Song 파일과 Podcast 파일을 모두 Include합니다. 네 개의 inputs를 받습니다. song title, artist name, podcast title, 그리고 episode number(문자열로 받은 뒤 integer로 변환)입니다. 이 값들로 Song object와 Podcast object를 Create합니다. 먼저 song에서 play()를 calling한 result를 Print한 다음, podcast에서 calling한 result를 Print합니다. 각각 한 줄씩 출력합니다.
이 challenge는 abstract class가 contract를 어떻게 Define하는지 보여 줍니다. 모든 media type에는 play() method가 있어야 하지만, 각 type은 이를 서로 다르게 Implement합니다. abstract Media class는 직접 instantiated할 수 없으며, 자식들에게 structure와 shared functionality를 제공하기 위해서만 존재합니다.
직접 해보기
<?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() 호출 결과 출력
?>이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 PHP 컴파일러