선생님을 위한 프로그래밍 수업

코스 전체목록

닫기

abstract

수업소개

abstract는 클래스의 메소드를 하위 클래스가 반드시 오버라이드 하도록 하는 것입니다. 이것을 통해서 부모 클래스의 일부 기능을 하위 클래스가 구현하도록 강제할 수 있습니다. 

이 수업에서는 디자인 패턴이 무엇인가를 설명합니다. 그 중에서 템플릿 메소드 패턴을 통해서 추상 클래스가 사용되는 구체적인 사례를 살펴봅니다. 

수업

소개

형식

 

<?php
abstract class ParentClass
{
    public function a()
    {
        echo 'a';
    }
    public abstract function b();
}
class ChildClass extends ParentClass
{
    public function b()
    {
        
    }
}

 

사례 : 템플릿 메소드 패턴

템플릿 메소드 패턴 구현

 

<?php
abstract class AbstractPageTemplate
{
    protected final function template()
    {
        $result = $this->header();
        $result .= $this->article();
        $result .= $this->footer();
        return $result;
    }
    protected abstract function header();
    protected abstract function article();
    protected abstract function footer();
    public function render()
    {
        return $this->template();
    }
}
class TextPage extends AbstractPageTemplate
{
    protected function header()
    {
        return "PHP\n";
    }
    protected function article()
    {
        return "PHP: Hypertext Preprocessor\n";
    }
    protected function footer()
    {
        return "website is php.net\n";
    }
}
class HtmlPage extends AbstractPageTemplate
{
    protected function header()
    {
        return "<header>PHP</header>\n";
    }
    protected function article()
    {
        return "<article>PHP: Hypertext Preprocessor</article>\n";
    }
    protected function footer()
    {
        return "<footer>website is php.net</footer>\n";
    }
    public function render()
    {
        $result = '<html>';
        $result .= $this->template();
        return $result.'</html>';
    }
}
echo '<h1>text</h1>';
$text = new TextPage();
echo $text->render();

echo '<h1>html</h1>';
$html = new HtmlPage();
echo $html->render();

 

댓글

댓글 본문
  1. hanjaelee
    2024.03.05 수강완료
  2. 드림보이
    2022.01.25. abstract 파트 수강완료
  3. jeisyoon
    2021.08.11 Abstract(Template Design pattern) - OK
  4. psmqdt
    OOP 언어가 정말 장족의 발전을 했군요. 10년이면 강산도 변한다는 말이 딱 들어맞는 것 같습니다.
    요즘은 C++ 를 쓰지 않지만, C++ 쓸 때는 class 때문에 정말 고생 많이 했는데. 수학 class 들 쪽으로 장족의 발전을 했을까요? matlab도 class가 있기는 하지만, 쓸 일이 별로 없으니. matlab을 보며 간혹 안에서는 어떻게 class가 구성되어 있을지 생각해보면, 수식의 경우는 matrix class 하나만으로 되어 있을 것 같습니다. 1x1 matrix 는 complex이고 이는 실수, 허수, 정수를 다 포함하니, 이들에 대한 class를 따로 만들 필요가 없을 것 같습니다. 단지 안에서 complex, 실수, 허수, 정수만 판단해줄 것 같습니다. class를 만들지 않고.
    또한 그것이 matlab의 한계인 것 같습니다. matlab에서는 matrix는 2-tuple로 되어 있는 것 같습니다. 왜냐하면 그 이상의 tuple은 2-tuple과 쉽게 같이 쓸 수 없고, 따로 특수 함수를 써야 하니까. 아마, 미래의 matlab은 n-tuple 하나 만을 class로 해서 matrix, 실수, 허수 모두를 취급할 것 같습니다. 그렇다 하더라도, tensor라는 문제에 부닥치겠군요. tensor를 기본 class로 해야하나? 결국, 쉽지 않은 문제가 될 것 같습니다.
  5. 홍콩돼지
    6개월 전이라 이미 아시겠지만...

    interface는 실제 동작을 가지지 못하므로 abstract class 안에서 해당 class내에서 공통적인 부분을 만들어둘 수 있게 됩니다. (templete method)
    위의 예제에서 header, article, footer method를 abstract로 준 이유는 여기의 return값이 변화될 수 있기 때문입니다.

    각 class에서 abstract method들의 값들의 내용은 다르지만(html태그가 붙어서 출력됨) 사용되어질 규칙은 같으므로(string 값이고 이를 웹브라우저에 출력해 줄 것이다)
    묶어서 부모 abstract class를 만들어 주고 각각 상속받은 클래스의 abstract method에서 다른 값들을 return해 주는 것입니다.

    render method는 abstract와 관계엾이 override된 것입니다.
    대화보기
    • 웅이
      제가 abstract의 본질을 잘 모르겠어서 질문합니다 ㅠㅠ
      자식 클래스에서 override를 해서 method의 내용을 정의해야되는거라면,
      이름만 있고 내용은 없는 method를 abstract를 써서 반드시 구현하게 하는
      이유가 뭔가요?
    • 코코딩
      php 에서는

      var num = '';
      num += 123;

      += 연산자를

      $num = '';
      num .= 123;

      .= 이렇게 쓰는군요.

      밑에 이고잉님 설명도 있었는데
      한참 보고 뭔가.. 했네요 : )
    • orez
      감사합니다. 여러 번 다시 읽어보니 이해가 됩니다.
    • spacepublisher
      잘봤습니다-

      협업의 입장에서 바라본다면,
      인터페이스는 작업을 비슷한 수준의 개발자가 병렬적으로 찢어놓는데에 유리하다면,
      앱스트랙트는 작업을 사수-부사수처럼 책임과 실력이 비대칭인 상황에서 유리하겠네요.
    • dufuqsls
      잘봣습니다.
    • egoing
      $result .= $this->template();

      $result = $result.$this->template();
      와 같은 의미입니다~
      대화보기
      • 이고잉님!실습하던 중 처음부터 막혀버렸습니다. 변수 result에 차례대로 값을 여러번 넣으면 결국 마지막 입력값만 출력하게되던데.. 원래 변수는 이렇게 나오는거 아닌가요? ㅠㅠ이고잉님껀 차례대로 합쳐져서 다 나오던데,, 대체 뭐가다른가요? ㅜㅜ하.. ㅠ
      버전 관리
      egoing
      현재 버전
      선택 버전
      graphittie 자세히 보기