Menu
Coddy logo textTech

추상 클래스

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();

출력:

15

Shape 클래스는 구현을 제공하지 않고 추상 메서드 calculateArea()를 선언합니다. Shape를 확장하는 모든 클래스는 이 메서드를 구현해야 합니다. 추상 클래스는 자식 클래스가 직접 상속받는 getColor()와 같은 일반 메서드도 포함할 수 있다는 점에 유의하세요.

추상 메서드는 자식 클래스가 무엇을 해야 하는지 정의하지만, 어떻게 해야 하는지는 정의하지 않습니다. 이는 모든 도형이 calculateArea() 메서드를 갖도록 보장하면서, 각 도형이 자신의 넓이를 다르게 계산할 수 있도록 합니다.

핵심 포인트: 추상 클래스는 상속의 구조와 강제된 요구 사항을 결합합니다. 관련된 클래스들 간에 코드를 공유하면서 각 자식 클래스가 특정 메서드를 반드시 구현하도록 보장하고 싶을 때 사용하세요.

challenge icon

챌린지

쉬움

추상 클래스가 계약을 강제하면서도 서로 다른 미디어 유형이 각자의 재생 동작을 구현할 수 있도록 하는 미디어 플레이어 시스템을 구축해 보겠습니다.

코드는 다음 세 개의 파일로 구성됩니다:

  • Media.php — 모든 미디어 유형의 청사진 역할을 하는 추상 클래스 Media를 정의합니다. 이 클래스는 보호된(protected) $title 속성과 제목을 받아 설정하는 생성자를 가져야 합니다. 자식 클래스가 반드시 구현해야 하는 play()라는 추상 메서드를 포함하세요. 또한 제목을 반환하는 일반 메서드 getTitle()을 추가하세요. 이 구체적인 메서드는 모든 자식 클래스에 상속됩니다.
  • Song.phpMedia를 상속받는 Song 클래스를 정의합니다. 파일 상단에 Media 파일을 포함(include)하세요. 이 클래스는 $artist 속성을 추가합니다. 생성자는 제목과 아티스트를 인자로 받아야 하며, 제목은 parent::__construct()를 사용하여 설정하고 아티스트는 직접 설정하세요. "Playing song: [title] by [artist]"를 반환하도록 필수 메서드인 play()를 구현하세요.
  • Podcast.phpMedia를 상속받는 Podcast 클래스를 정의합니다. 파일 상단에 Media 파일을 포함하세요. 이 클래스는 $episode 속성(정수)을 추가합니다. 생성자는 제목과 에피소드 번호를 인자로 받아야 하며, 제목은 parent::__construct()를 사용하여 설정하고 에피소드는 직접 설정하세요. "Playing podcast: [title] - Episode [episode]"를 반환하도록 필수 메서드인 play()를 구현하세요.

main.php에서 Song과 Podcast 파일을 모두 포함하세요. 노래 제목, 아티스트 이름, 팟캐스트 제목, 에피소드 번호(정수로 변환할 문자열)의 네 가지 입력을 받게 됩니다. 이 값들로 SongPodcast 객체를 생성하세요. 먼저 노래의 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() 호출 결과 출력

?>
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨